我的索引视图略显笨重,因此我将所有数据库查询移动到演示者中以尝试清理。
但是,对任何查询使用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 %>
答案 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