0

ユーザーは多くのプロファイルを持つことができます。各プロファイルには独自のプロパティがあります。また、ユーザーはいつでもどこでもプロファイルを変更できます。

current_profileそのため、ユーザー(deviseのcurrent_userヘルパーなど)を設定できるコントローラーとビューで使用可能なメソッドまたは変数を設定したいと思います。

ApplicationControllerプライベートメソッドとメソッドを使用してみましApplicationHelperたが、ユーザーのニックネームが使用できない場合(URLパラメーターで設定されている場合)は機能しません。

これはAppControllerメソッドです

...
private
  def set_profile
    if params[:username]
      @current_profile ||= Profile.where(username: params[:username]).entries.first
    else
     nil
    end
  end

そしてこれはAppHelperメソッドです

def current_profile
  unless @current_profile.nil?
    @current_profile
  end
end

何か案が?

4

3 に答える 3

1

ActionController::Base を拡張する lib を作成し (整理用)、そこに "set_profile" と "current_profile" をヘルパー メソッドとして定義し、それを require して ApplicationController で呼び出します。

application_controller.rb

require 'auth'

before_filter :set_profile # sets the profile on every request, if any

lib/auth.rb

class ActionController::Base
  helper_method :set_profile, :current_profile

  protected

  def set_profile
    if params[:username]
      session[:user_profile] = params[:username]
      ...
    end
  end

  def current_profile
    @current_profile ||= if session[:user_profile]
      ...
    else
      ...
    end
  end

end

そうすれば、コード内の任意の場所 (ビューとコントローラー) で current_profile を呼び出すことができます。

于 2012-11-19T14:59:46.233 に答える
0

@current_profileApplicationControllerのmemeber変数がヘルパーに表示されないため。Appcontrollerで次のようなアクセサメソッドを作成する必要があります。

def current_profile
  @current_profile
end

または経由

attr_accessor :current_profile

そしてヘルパーで(コントローラーのアクセサーがプライベートでないことを確認してください):

def current_profile
  controller.current_profile
end

ただし、コントローラーをまったく関与させずに、これをヘルパーのみとして自由に定義することもできます。

  def current_profile
    if params[:username]
      @current_profile ||= Profile.where(username: params[:username]).first
    end
  end

これにより、データベースクエリが自動的にキャッシュ@current_profileされ、パラメータが指定されていない場合は自動的にnilが返されます。elseしたがって、追加の句や追加のset_...メソッドは必要ありません

于 2012-11-19T08:37:39.023 に答える
0

プロファイルに列をUser has_many :profiles追加できる関係がある場合。current:booleanそれで:

def set_profile
  if params[:profile_id]
    @current_profile = Profile.find(params[:profile_id])
    @current_profile.current = true
  else
    nil
  end
end

# helper_method
def current_profile
   @current_profile
end
于 2012-11-19T05:19:15.847 に答える