Маршрутизация root для отображения сообщений пользователя для зарегистрированных пользователей и статической страницы для не зарегистрированных пользователей. - PullRequest
3 голосов
/ 08 апреля 2011

История: Пользователь, не вошедший в систему, должен видеть статическую страницу приветствия, а после входа в систему он должен видеть список своих сообщений в блоге.

Полагаю, правильный способ сделать это - направить root к действию, которое перечисляет все сообщения пользователя, которые затем проверяют подлинность. Если пользователь не вошел в систему, то он отображает страницу приветствия?

Мне нужна помощь в написании действия для контроллера сообщений, который отображает сообщения для вошедшего в систему пользователя.

Ответы [ 2 ]

1 голос
/ 21 апреля 2012

У меня была эта проблема, но я не хотел перенаправления (добавляет задержку и изменяет URL), поэтому я выбираю ограничения, предложенные в Ориентированная на пользователя маршрутизация в Rails 3 или маршруты с областями действия, упомянутые в Используйте лямбда-выражения для Rails 3 Route Constraints

Ограничения

root :to => "landing#home", :constraints => SignedInConstraint.new(false)

Области действия

scope :constraints => lambda{|req| !req.session[:user_id].blank? } do
  # all signed in routes
end
1 голос
/ 08 апреля 2011

routes.rb:

root :to => "posts#index"

post_controller.rb

class PostsController < ApplicationController
  before_filter :authenticate_user!

  def index
    @posts = current_user.posts.all
  end
end

Если пользователь не вошел в систему, фильтр before поймает это и перенаправит куда-то (логин? Сообщение об ошибке?). В противном случае вызывается метод индекса и отображается представление индекса. Это будет работать «из коробки» с устройством, если вы запускаете другую аутентификацию, вам нужно адаптировать и / или написать своих собственных помощников, например, как то так:

application.html.erb

class ApplicationController < ActionController::Base
  protect_from_forgery

  helper_method :current_user
  helper_method :user_signed_in?

  private  
    def current_user  
      @current_user ||= User.find_by_id(session[:user_id]) if session[:user_id]  
    end

    def user_signed_in?
      return 1 if current_user 
    end

    def authenticate_user!
      if !current_user
        flash[:error] = 'You need to sign in before accessing this page!'
        redirect_to signin_services_path
      end
    end 
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...