Undefined variable locale ou de la méthode `params' pour Presenter
J'ai un index de la vue qui devenait légèrement plus volumineux, donc j'ai déplacé toutes les requêtes DB dans un présentateur d'essayer et de faire le ménage.
Cependant, l'utilisation de params[:quelque chose] avec n'importe quelle requête rend le présentateur d'erreur avec:
undefined local variable or method params for QuestionPresenter:0x007fd6d569c158
J'ai essayé de déplacer les paramètres dans les méthodes d'aide à applicationcontroller, et les modèles, mais sans succès.
Comment puis-je faire de ces params disponible pour le présentateur? Ou sont les présentateurs ne vise pas à faire face à de tels params?
Vieux question_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 ( nouvelle action index)
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 %>
Vous devez vous connecter pour publier un commentaire.
vous avez à passer dans les params de hachage à partir du contrôleur à votre QuestionPresenter:
QuestionsController.rb ( nouvelle action index)
question_presenter.rb
La
params
variable est accessible uniquement à partir d'un Contrôleur ou d'une Vue.Vous devez passer à la
QuestionPresenter
pour y accéder.Par exemple, vous pourriez passer est de la
QuestionPresenter#new
méthode de sorte que vous l'avez obtenu dans leinitialize
méthode et vous pouvez l'enregistrer dans une variable d'instance@params
et de remplacer partout dans leQuestionPresenter
classeparams
par@params
.params
n'est pas une variable, c'est une méthode retourne un HashWithIndifferentAccess.