0

私はたくさんの異なるコントローラーを持っていて、標準の「ようこそ、ユーザー」を実行できるようにしたいと思っています。任意のコントローラーからアクセスできるようにユーザー変数を割り当てるにはどうすればよいですか?

これが私がこれまでにアプリケーションコントローラーに持っているものです:

class ApplicationController < ActionController::Base
    before_filter :authorize

  protect_from_forgery

    private

        def current_user
            User.find(session[:user_id])
        end

  protected

    def authorize
        unless User.find_by_id(session[:user_id])
            redirect_to login_url, :notice => "Please Login"
        end
    end
end

これが私のapplication.html.hamlファイルです:

!!!
%html
    %head
        %title Pears
        = stylesheet_link_tag    "application", :media => "all"
        = javascript_include_tag "application"
        = csrf_meta_tags
    %body
        %header
            = link_to('Home', '/')
            - if session[:user_id]
                Welcome, 
                = current_user.firstname
                = link_to('Logout', logout_path, method: :delete)
            - else
                = link_to('Login', login_path)
                = link_to('Signup', signup_path)
        = yield

最善のアプローチは何ですか?

ありがとう!

4

3 に答える 3

0

通常、ビューはコントローラーメソッドを呼び出すことができません。ただし、必要に応じて、特定の方法でこれを許可することもできます。

class ApplicationController < ActionController::Base
  ...
  def current_user
    ...
  end
  helper_method :user
end

ユーザーが毎回データベースからフェッチされるか、セッションにデータが保存されているかは重要ではありませんが、ビューをその詳細に結合するべきではありません。

また、パフォーマンスの違いがどれだけあるかを最初に理解せずに、最適化としてセッションにユーザー名だけを隠しておくことにも少し注意します。

于 2012-11-16T16:49:45.520 に答える
0

ユーザー名をウェルカムメッセージに埋め込むことができるようにするだけの場合は、おそらくそれをセッションに保存し(最適化として、毎回フェッチされないようにするため)、表示されるパーシャルを作成します。

Hello, <%= session[:username] %>

レイアウト、またはこのメッセージを表示する場所にパーシャルを含めます。

ユーザー名以上またはそのような少量のデータを探している場合でも、部分的に表示するのが最善の策ですが、データベースから情報をフェッチしてデータをロードする前に(MrYoshijiによって提案されたように)、おそらく良い考えです。

于 2012-11-16T16:32:35.997 に答える
0

current_userはプライベートメソッドです。パブリックにしてください。コードはおそらく機能します。

于 2012-11-16T16:38:38.670 に答える