我在控制器问题中有一个动作,它包含在控制器中。此操作不会呈现在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
答案 0 :(得分:4)
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
块中包含您在关注中定义的所有操作/方法。这样,块中的任何内容都将被视为直接写入包含器对象(即您将其混合到的控制器中)
使用此解决方案,没有松散的末端,没有特质,没有与轨道模式的偏差。您将能够使用respond_to
块,并且不必处理奇怪的事情。
答案 1 :(得分:1)
我不认为这是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时才能使用它,可能是因为this。