Rails 3 render action from another controller

匿名 (未验证) 提交于 2019-12-03 08:44:33

问题:

I need to render another controller action and i get this error

Missing partial controller/index with {:formats=>[:html], :locale=>[:en, :en], :handlers=>[:rjs, :rhtml, :rxml, :erb, :builder]} in view paths "/path_to/app/views"

how can i render another controller action into a view but without sending an redirect to the client ? I've tried

 "index", :controller=>"controller" %> 

but it seems that is not working.

回答1:

Try to render template:

 "controller/index" %>  

Or file:

 "#{Rails.root}/app/controllers/controller/index" %>  

And I believe you should render it through controller, as far as it is more convenient:

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


回答2:

This works well for me :

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 

then, call by

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

basically it hacks the other class and overwrites its "params" method and return

If you are using Rails 4:

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


回答3:

From Rails Guides page:

Using render with :action is a frequent source of confusion for Rails newcomers. The specified action is used to determine which view to render, but Rails does not run any of the code for that action in the controller. Any instance variables that you require in the view must be set up in the current action before calling render.

So in short you can't render another action, you can only render another template. You could get the shared code and move it to a method in application controller. You could also try something along this lines if you really can't structure your code in some other way:

# 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 


回答4:

If you do not want just to render the view of the other controller (/model), but calling the action (method), think more the ruby way of life - put this method(s) into a module and include it in the controllers you need it.

I think its less 'spooky' then somehow touching an other controller.

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!