如何从控制器中包含的模块渲染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时才能使用它,可能是因为这个原因 。