Rails 3 render action from another controller

后端 未结 4 2040
攒了一身酷
攒了一身酷 2020-12-01 08:19

I need to render another controller action <%= render \"controller/index\" %> and i get this error

Missing partial controller/inde

相关标签:
4条回答
  • 2020-12-01 08:20

    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
    
    0 讨论(0)
  • 2020-12-01 08:24

    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 < 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
    
    0 讨论(0)
  • 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
    
    0 讨论(0)
  • 2020-12-01 08:36

    Try to render template:

    <%= render :template => "controller/index" %> 
    

    Or file:

    <%= render :template => "#{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
    
    0 讨论(0)
提交回复
热议问题