从单击视图中调用自定义控制器方法,然后在Ruby on Rails 4中更新视图

时间:2015-07-13 08:39:20

标签: ajax ruby-on-rails-4 controller

我最近一直在研究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,所以如果我提交的内容有问题,请告诉我。我花了一些时间看着类似的问题,但没有运气。谢谢!

2 个答案:

答案 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" %>

感谢您的帮助!