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

Calling custom controller method from view on click and then updating view in Ruby on Rails 4

我最近一直在研究 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。然后,我在以下文件中呈现我需要的内容并更新 games/show.html.erb

中的“#question-show”div
#questions/show.js.erb
$('#question-show').html("<%= escape_javascript(render 'question') %>");

questions/_question.html.erb 部分包含有关该特定问题的信息。

这现在工作正常。但是,我每场比赛都有多个问题,我希望 games/show.html.erb 中的 <%= link_to 'Next Question', @question, remote: 'true', :class=> btn" %> 首先更新 @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 上发帖,所以如果我的提交有问题,请告诉我。我花了一段时间看类似的问题,但没有任何运气。谢谢!

好的。

您可以从另一个控制器

渲染您的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 } }

这样的局部变量

好的,原来我正在寻找的答案是我迄今为止在 SO 上看到的所有内容的组合。

我忘记做的主要事情是添加一条路线。

#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" %>

感谢您的帮助!