如何从控制器中包含的模块渲染js模板?

我在控制器问题中有一个动作,它包含在一个控制器中。 此操作不会呈现在respond_to块下指定的js.erb文件。 如何在控制器关注中正确获取操作以成功呈现js.erb文件(或任何视图)? 我的路线有问题吗?

模块操作的链接

= link_to image_tag("upvote.png"), send("vote_socionics_#{votable_name}_path", votable, vote_type: "#{s.type_two_im_raw}"), id: "vote-#{s.type_two_im_raw}", method: :post, remote: true 

**控制器动作的链接**

 = link_to "whatever", characters_whatever_path, remote: true 

控制器/ characters_controller.rb

 class CharactersController < ApplicationController include SocionicsVotesConcern def an_action respond_to do |format| format.js { render 'shared/vote_socionics' } # This renders/executes the file end end 

控制器/关切/ socionics_votes_concern.rb

 module SocionicsVotesConcern extend ActiveSupport::Concern def vote_socionics respond_to do |format| format.js { render 'shared/vote_socionics' } # This DOES NOT render/execute the file. Why? end end end 

视图/共享/ whatever.js.erb

  # js code that executes 

的routes.rb

  concern :socionics_votes do member do post 'vote_socionics' end end resources :universes resources :characters, concerns: :socionics_votes resources :celebrities, concerns: :socionics_votes resources :users, concerns: :socionics_votes 

 module SocionicsVotesConcern extend ActiveSupport::Concern included do def vote_socionics respond_to do |format| format.js { render 'shared/vote_socionics' } end end end end 

included do块中included do您在关注点中定义的任何操作/方法。 这样,块中的任何内容都将被视为直接写入包含器对象(即您将其混合到的控制器中)

使用此解决方案,没有松散的端点,没有特性,没有与轨道模式的偏差。 您将能够使用respond_to块,而不必处理奇怪的事情。

我不认为这是Rails兼容的人。

  • 控制器操作呈现视图或重定向;
  • 模块有方法。 方法执行代码;

因此,仅仅包含一个名为控制器的模块中的方法是行不通的。 你真正需要做的是从控制器A调用一个动作到控制器B.So SocionicsVotesController将变成一个真正的控制器类,你将使用redirect_to rails方法。

您必须指定要重定向到的控制器和操作,例如:

 redirect_to :controller => 'socionics', :action => 'index' 

要不就:

 redirect_to socionics_url 

默认情况下,它将发送HTTP 302 FOUND

编辑:

如果您想重用控制器操作响应的方式,在使用rails 4问题时,请尝试以下操作:

 class CharactersController < ApplicationController include SocionicsVotesControllerConcerns # not actually a controller, just a module. def an_action respond end module SocionicsVoteControllerConcerns extend ActiveSupport::Concern def respond respond_to do |format| format.html { render 'whatever' } format.json { head :no_content } end end end 

我只是将format.js更改为format.html时才能使用它,可能是因为这个原因 。