我需要渲染另一个控制器操作<%= render "controller/index" %>
我收到此错误
缺少视图路径"/path_to/app/views"中带有 {:formats=>[:html], :locale=>[:en, :en], :handlers=>[:rjs, :rhtml, :rxml, :erb, :builder]} 的部分控制器/索引
如何在不向客户端发送重定向的情况下将另一个控制器操作呈现到视图中?我试过了
<%=render :action => "index", :controller=>"controller" %>
但这似乎不起作用。
尝试渲染模板:
<%= render :template => "controller/index" %>
或文件:
<%= render :template => "#{Rails.root}/app/controllers/controller/index" %>
我相信你应该通过控制器渲染它,只要它更方便:
def your_action
...
render :action => :index
end
这对我来说很有效:
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
来自 Rails Guides 页面:
简而言之,您无法渲染另一个将渲染与 :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
如果您不想只渲染另一个控制器(/model)的view
,而是调用action
(方法),请更多地考虑 ruby 的生活方式 - 将此方法放入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
另一个控制器的部分是没有问题的.
那么,为什么不将原始操作视图移动到部分视图,并在您需要的任何位置呈现此部分:
将 app/views/controller_a/index.html.erb 移至app/views/controller_a/_index.html.erb .
app/views/controller_a/index.html.erb:
<%= render partial: 'index' %>
app/view/controller_b/some_action.html.erb:
<%= render partial: 'controller_a/index' %>