1

ユーザーがログインする必要があるアクションでbefore_filterを機能させようとしていますが、そうではないため、何かが間違っている必要があります。

ログイン/ログアウト、およびユーザーがログインしているかどうかの確認(signed_in?)には、「session_helper.rb」というヘルパーファイルを使用します。アクション内またはビューで使用すると正常に機能しますが、before_filerで使用している間は機能しません。ユーザーをログアウトして「/projects/ new」にアクセスしようとすると、それは可能ですが、そうではないはずです。

私は何が間違っているのですか?

プロジェクトコントローラー:

class ProjectsController < ApplicationController
  before_filter :signed_in?, :except => [:index]  // <-- doesn't prevent e.g. the action "new" to be executed

  def new
    @project = Project.new
    @users = (current_user.blank? ? User.all : User.find(:all, :conditions => ["id != ?", current_user.id]))
  end

  def index
    @projects = Project.all

    if signed_in?  // <-- works as it should
      @users_projects = Project.where(:user_id => current_user.id)
    end
  end

  ... other actions ...

end

session_helper.rb

module SessionsHelper

  def sign_in(user)
    cookies.permanent[:remember_token] = user.remember_token
    self.current_user = user
  end

  def signed_in?
    !current_user.nil?
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= User.find_by_remember_token(cookies[:remember_token])
  end

  def sign_out
    self.current_user = nil
    cookies.delete(:remember_token)
  end
end
4

2 に答える 2

6

したがって、before_filterは少し誤解を招く名前です。それは実際にはフィルターではありません。誤った値を返した場合に他のアクションを除外して発生を防ぎ、正しい値を返した場合にそれらを許可するわけではありません。これは、実際には何よりも先にメソッドを呼び出す方法です。「ルートがトリガーしたアクションを呼び出す前に、次のメソッドを呼び出してください」と考えてください。

実際、Rails 4では、before_filterの名前をbefore_actionに変更しているため、今後の混乱が緩和されるはずです。

signed_inからT/Fを返しているだけですか?そのチェックの結果に基づいて特別なことをするように指示していないので、それをチェックして次に進みます。

では、signed_inを呼び出すのではなく?このようなものが機能します:

before_filter :authorize, :except => [:index]

def authorize
  redirect_to login_url, alert: "Not authorized" if !signed_in?
end

役立つホップ。

于 2013-02-11T19:33:36.820 に答える
1

現在ログインしていないときに、before_filterが例外を発生させたり、別のページにリダイレクトしたりするのをいつも見ています。falseを返すと、ページがレンダリングされなくなるかどうかはわかりません。

于 2013-02-11T19:21:51.617 に答える