Rails 3从另一个控制器渲染动作

时间:2011-05-18 22:28:09

标签: ruby-on-rails-3 erb

我需要渲染另一个控制器动作<%= render "controller/index" %> 我收到此错误

  

缺少部分控制器/索引{:formats =&gt; [:html],:locale =&gt; [:en,:en],:handlers =&gt; [:rjs,:rhtml,:rxml,:erb ,:builder]}在视图路径“/ path_to / app / views”

如何将另一个控制器操作渲染到视图中但不向客户端发送重定向? 我试过了

<%=render :action => "index", :controller=>"controller" %>

但似乎无效。

4 个答案:

答案 0 :(得分:29)

尝试渲染模板:

<%= render :template => "controller/index" %> 

或文件:

<%= render :template => "#{Rails.root}/app/controllers/controller/index" %> 

我相信你应该通过控制器渲染它,只要它更方便:

def your_action
  ...
  render :action => :index
end

答案 1 :(得分:21)

这对我很有用:

def renderActionInOtherController(controller,action,params)
  controller.class_eval{
    def params=(params); @params = params end
    def params; @params end
  }
  c = controller.new
  c.request = @_request
  c.response = @_response
  c.params = params
  c.send(action)
  c.response.body
end

然后,通过

打电话
render :text => renderActionInOtherController(OtherController,:otherAction,params)

基本上它会攻击其他类并覆盖其“params”方法并返回

如果您使用的是Rails 4:

def renderActionInOtherController(controller,action,params)
    c = controller.new
    c.params = params
    c.dispatch(action, request)
    c.response.body
end

答案 2 :(得分:19)

来自Rails指南page

  

使用render with:action是一个   Rails的常见混淆源   新人。指定的操作是   用于确定哪个视图   渲染,但Rails不运行任何   该行动的代码   控制器。任何实例变量   您必须在视图中需要   在之前的行动中设置   调用渲染。

因此,简而言之,您无法渲染另一个动作,您只能渲染另一个模板。您可以获取共享代码并将其移动到应用程序控制器中的方法。如果你真的无法以其他方式构建代码,你也可以尝试这方面的事情:

# This is a hack, I'm not even sure that it will work and it will probably
# mess up your filters (like ignore them).
other_controller = OtherController.new
other_controller.request = @_request
other_controller.some_action

答案 3 :(得分:0)

如果你不想只渲染另一个控制器(/ model)的view,而是调用action(方法),那么想想红宝石的生活方式 - 把这个方法( s)进入module并将其包含在您需要的控制器中。

我认为它不那么'怪异'然后以某种方式触及另一个控制器。

module StandardActions
    def show_user_homepage(local_params=params)
        #something finding 
        #something to check
        render :"homepage/show" 
    def
end

class AddressesController < ApplicationController
    include StandardActions

    def update
        # update address
        if ok
            show_user_homepage(id: user_id)
        else
            #errorthings
            render :edit #(eg.)
        end
    end         
end

class HobbiesController  < ApplicationController
    include StandardActions

    def update      
        # update hobby
        if ok
            show_user_homepage(id: user_id)
        else
            #errorthings
            render :edit #(eg.)
        end
    end         
end