我需要渲染另一个控制器动作<%= 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" %>
但似乎无效。
答案 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