Presenter的未定义局部变量或方法`params'

时间:2013-06-25 17:00:29

标签: ruby-on-rails ruby ruby-on-rails-3

我的索引视图略显笨重,因此我将所有数据库查询移动到演示者中以尝试清理。

但是,对任何查询使用params [:something]会导致演示者错误:

undefined local variable or method params for QuestionPresenter:0x007fd6d569c158

我已经尝试将params移动到applicationcontroller中的辅助方法,而模型却没有成功。

如何向演示者提供这些参数?或者主持人不打算处理这类参数?

旧问题_controller.rb

def index       
   if params[:tag]
      @questions = @question.tagged_with(params[:tag]).paginate(page: params[:page], per_page: 20)
    elsif params[:search]
      @questions = @question.paginate(page: params[:page], per_page: 20).search(params[:search])
    else
      @newest = @questions.newest.paginate(page: params[:page], per_page: 2)
      @unanswered = @question.unanswered.paginate(page: params[:page], per_page: 2).search(params[:search])
      @votes = @question.by_votes.paginate(page: params[:page], per_page: 2).search(params[:search])
  end 
end

QuestionsController.rb(新索引操作)

def index
  @presenter = QuestionPresenter.new
end

question_presenter.rb

class QuestionPresenter
  def initialize
    @questions = Question
    @tags = Tag
  end

  def questions
    @questions.paginate(page: params[:page], per_page: 20).search(params[:search])
  end

  def tags
   @tags.joins(:taggings).select('tags.*, count(tag_id) as "tag_count"').group(:tag_id).order(' tag_count desc')
  end

  def tagged_questions
    @questions.tagged_with(params[:tag])
  end

  def newest
    @questions.newest.paginate(page: params[:page], per_page: 20)
  end

  def unanswered
    @questions.unanswered.paginate(page: params[:page], per_page: 20)
  end

  def votes
    @questions.by_votes.paginate(page: params[:page], per_page: 20)
  end
end

index.html.erb

<%= render partial: "questions/tag_cloud", locals: {tags: @presenter.tags} %>

<% if params[:search] %> 
  <%= render partial: "questions/questions", locals: {questions: @presenter.questions} %>
<% elsif params[:tag] %>
  <%= render partial: "questions/questions", locals: {questions: @presenter.tagged_questions}%>
<% else %>
  <%= render partial: "questions/tabbed_index", locals: {questions: @presenter.newest, unanswered: @presenter.unanswered, votes: @presenter.votes} %>
<% end %>

2 个答案:

答案 0 :(得分:4)

params变量只能从Controller或View中访问。

您必须将其传递给QuestionPresenter才能访问它。 例如,您可以传递给QuestionPresenter#new方法,以便在initialize方法中获取它并将其保存到实例变量@params中并替换QuestionPresenter中的任何位置} params @params。{/ p>

答案 1 :(得分:4)

你必须将控制器的params散列传递给QuestionPresenter:

QuestionsController.rb(新索引操作)

def index
  @presenter = QuestionPresenter.new(params)
end

question_presenter.rb

class QuestionPresenter
  def initialize(params = {})
    @questions = Question
    @tags = Tag
    @params = params
  end

  def params
    @params
  end

  ...

end