1

Michael Hartls rails tutorial で、次のコードに出くわしました。

module SessionsHelper 
def current_user=(user)
  @current_user = user
 end

 def current_user  #get logged in user
  @current_user||=User.find_by_remember_token(:remember_token)
 end

 def sign_in(user)   #sign the user in by setting cookies
  cookies.permanent[:remember_token]= user.remember_token
  current_user = user
 end

 def signed_in?(user)   #check whether user signed in
  !current_user.nil?
 end

end

私の SessionsController 作成アクションは次のようになります。

def create
 user = User.find_by_email(params[:session][:email])
 if user && user.authenticate(params[:session][:password])
  sign_in user   # sign the user in by setting cookies
 else
  flash.now[:error]= "Invalid email/password"
  render 'new'
 end
end

ライターメソッドが必要な理由

def current_user=(ユーザー)
SessionsHelper モジュールで ?

user の値を @current_user 変数に直接割り当てることはできませんか?

ログイン
方法 ?次のようにできますか?

module SessionsHelper 

 # Notice that there is no def current_user=(user) method.

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

 def sign_in(user)
  cookies.permanent[:remember_token]= user.remember_token
  @current_user = user   #set the current user directly withoout a writer method
 end

 def signed_in?(user)
  !current_user.nil?
 end

end
4

1 に答える 1

1

確かに、あなたはそのようにすることができます。しかし、アイデアは、インスタンス変数をカプセル化し、getter および setter メソッドの外部に直接割り当てないことです。それが ruby​​ の仕組みです。実際には SomeObject.@instanceVar= を行うことはできません。そのためにはセッターが必要です。

したがって、将来 current_user イーザーを設定する必要がある場合は、sign_in メソッドを使用するか、setter とまったく同じような新しいメソッドを作成する必要があります。では、なぜそれを使用しないのですか?

于 2013-06-06T04:29:21.543 に答える