0

申し訳ありませんが、質問をうまく表現できませんでした。私は Michael Hartl による Rails チュートリアルに従っています。それは素晴らしい本で、このサインイン メソッドまでは完全に理解できました。

module SessionsHelper
  def sign_in(user)
    remember_token = User.new_remember_token
    cookies.permanent[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.encrypt(remember_token))
    self.current_user = user
  end
......

ヘルパー メソッドは SessionsController で使用されます

class SessionsController < ApplicationController
  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_to user
    else
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end
......

self が現在のオブジェクトに評価され、current_user が属性であることはわかっています。しかし、ここにある現在のオブジェクトは何ですか? 誰が sign_in(user) を呼び出しましたか?

4

2 に答える 2

0

Rails の以前のバージョンではnamespacing、がヘルパーを使用できるビューをhelpers決定していました。controllers

于 2013-07-18T04:34:07.717 に答える
0

そのコントローラーメソッドの self は実際のコントローラーインスタンスであり、そのモジュールがクラスに含まれていたためアクセスでき、基本的にその機能をその中で宣言されたメソッドで拡張し、呼び出されたときにメソッドのようにクラスのインスタンス内で実行されますクラス内で定義されています。詳細については、こちらをご覧ください。

そのメソッドがそのクラスに存在しないためにエラーが発生する場合は、同様の質問に対するこの回答に示されているように、モジュールが含まれていないことが原因です。(本で説明されています)。

さて、このコメントのようにコントローラーに直接アクセスするとエラーが発生する理由。Railsルーターのように適切にセットアップせず、すべてのリクエスト情報とCookie jarなどの他のオブジェクトを追加する.

それがどのように機能するかを知りたい場合は、アクションパックディスパッチャを見てください:

SessionController.action(:new).call(env)

これは、ディスパッチャがラックからずっとさかのぼって受け取るリクエストenvから来ており、基本的には、HTTP リクエストから得られるものであり、ヘッダーをキーとして、その値を値として持つ文字列のハッシュです。

于 2014-12-04T01:34:47.617 に答える