Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 Rails 3从另一个控制器渲染动作_Ruby On Rails 3_Erb - Fatal编程技术网

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