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

时间:2014-07-16 05:34:16

标签: ruby-on-rails templates module actioncontroller respond-to

我在控制器问题中有一个动作,它包含在控制器中。此操作不会呈现在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

2 个答案:

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