Ruby on rails 3 Rails 3从另一个控制器渲染动作
我需要呈现另一个控制器操作Ruby on rails 3 Rails 3从另一个控制器渲染动作,ruby-on-rails-3,erb,Ruby On Rails 3,Erb,我需要呈现另一个控制器操作 我得到了这个错误 在视图路径“/path\u to/app/views”中缺少带有{:formats=>[:html],:locale=>[:en,:en],:handlers=>[:rjs,:rhtml,:rxml,:erb,:builder]}的部分控制器/索引 如何在不向客户端发送重定向的情况下将另一个控制器操作呈现到视图中? 我试过了 <%=render :action => "index", :controller=>"controller
我得到了这个错误
在视图路径“/path\u to/app/views”中缺少带有{:formats=>[:html],:locale=>[:en,:en],:handlers=>[:rjs,:rhtml,:rxml,:erb,:builder]}的部分控制器/索引
如何在不向客户端发送重定向的情况下将另一个控制器操作呈现到视图中?
我试过了
<%=render :action => "index", :controller=>"controller" %>
“index”,:controller=>“controller”%>
但这似乎不起作用。尝试渲染模板:
<%= render :template => "controller/index" %>
从导轨导轨:
使用render with:action是一种
Rails经常引起混淆
新来者。指定的操作是
用于确定要查看的视图
渲染,但Rails不运行任何
中该操作的代码
控制器。任何实例变量
您在视图中所需的
在当前操作之前设置
调用render
因此,简而言之,您不能呈现另一个动作,只能呈现另一个模板。您可以获取共享代码并将其移动到应用程序控制器中的方法。如果您确实无法以其他方式构造代码,您也可以尝试以下方法:
# 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
这对我来说很有效:
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
如果您不想只渲染另一个控制器(/model)的
视图
,而是调用操作
(方法),请更多地考虑ruby的生活方式-将此方法放入模块
,并将其包含在需要的控制器中
我认为它不像触摸其他控制器那么“恐怖”
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
模块标准动作
def显示用户主页(本地参数=参数)
#发现的东西
#有什么要检查的吗
呈现:“主页/显示”
def
结束
类地址控制器<应用程序控制器
包括标准行动
def更新
#更新地址
如果可以的话
显示用户主页(id:用户id)
其他的
#错误事物
渲染:编辑(例如)
结束
结束
结束
类HobbiesController<应用程序控制器
包括标准行动
def更新
#更新爱好
如果可以的话
显示用户主页(id:用户id)
其他的
#错误事物
渲染:编辑(例如)
结束
结束
结束
在视图/您的_controller/
中是否有index.html.erb
?为什么不使用重定向到正确的控制器操作?因为操作的逻辑可能完全不同,这些操作之间唯一的共同点是视图。我尝试使用render:template,但正在呈现html,我需要呈现index方法,因为index方法从DB获取该视图所需的一些数据。fl00r是正确的,最好从控制器内部处理。请注意,有一个内置的回退,如果找不到控制器/索引,它将呈现应用程序/索引。因此,如果有需要从不同控制器呈现的页面(而不是部分页面),请将它们放在app/views/application下。这对我来说也很有效,但我需要添加c.process\u action(action)
,以使我的在/u actions
之前触发。该死,这是一个巧妙的攻击。谢谢!
def renderActionInOtherController(controller,action,params)
c = controller.new
c.params = params
c.dispatch(action, request)
c.response.body
end
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