我最近一直在研究AJAX并尝试将其应用到我的Rails应用程序中。 我无法理解如何从视图中调用自定义控制器方法,然后更新视图。
我试图将一个helper_method添加到控制器,在那里我更新了我需要的属性。但是,我不确定如何从视图中调用此方法,如果我这样做,我如何重新渲染受该更改影响的部分。 replace_html适合吗?
=============
如果我的解释不清楚,这里是我正在寻找的具体解释:
目前,我在GamesController show方法中定义@question,然后在视图中执行此操作:
#games/show.html.erb
...
<%= link_to 'Next Question', @question, remote: 'true', :class=> "btn" %>
我让QuestionsController响应:html和:js。然后,我在以下文件中渲染我需要的内容并更新#question-show
中的“games/show.html.erb
”div
#questions/show.js.erb
$('#question-show').html("<%= escape_javascript(render 'question') %>");
questions/_question.html.erb
部分包含有关该特定问题的信息。
现在这很好用。但是,我每场比赛都有多个问题,我希望<%= link_to 'Next Question', @question, remote: 'true', :class=>
btn" %>
中的games/show.html.erb
首先更新@question是什么。我现在在GamesController中有这个,但它没有链接到我的视图:
def next_question
@game.progress += 1
@question = Question.find(@game.questions[@game.progress])
respond_to do |format|
format.json { head :no_content }
format.js
end
helper_method :next_question
在我更新@question后,我想用更新的问题重新呈现#question-show
div。
===============
无论如何,谢谢你的时间!第一次发布Stack Overflow,所以如果我提交的内容有问题,请告诉我。我花了一些时间看着类似的问题,但没有运气。谢谢!
答案 0 :(得分:1)
确定。
您可以从其他控制器呈现show.js.erb
respond_to do |format|
format.json { head :no_content }
format.js { render 'questions/show' }
end
但我更喜欢像format.js { render 'questions/show', locals:{ question: @question } }
答案 1 :(得分:0)
好的,事实证明我正在寻找的答案是迄今为止我所看到的所有内容的组合。
我忘记做的主要事情是添加一条路线。
#config/routes.rb
..
patch 'games/:id/next_question' => 'games#next_question', as: :games_next_question
这是我的控制器方法定义next_question,这是一个PATCH方法。
#controllers/games_controller.rb
..
before_action :set_game, only: [:show, :edit, :update, :destroy, :next_question]
..
def next_question
if @game.progress.equal?(@game.questions.length - 1)
@game.update_attribute(:progress, 0)
else
@game.update_attribute(:progress, @game.progress + 1)
end
@question = @game.questions[@game.progress]
respond_to do |format|
format.js {}
end
end
这是相应的.js.erb文件:
#views/games/next_question.js.erb
$('#question-show').html("<%= escape_javascript(render 'question') %>");
我的观点:
#views/games/show.html/erb
..
<%= link_to 'Next Question', games_next_question_path(:id => @game.id), method: :patch, remote: 'true', :class => "btn" %>
感谢您的帮助!