Rails 3 рендерит действие от другого контроллера - PullRequest
25 голосов
/ 19 мая 2011

Мне нужно сделать еще одно действие контроллера <%= render "controller/index" %> и я получаю эту ошибку

Отсутствует частичный контроллер / индекс с {: format => [: html],: locale => [: en,: en],: handlers => [: rjs,: rhtml,: rxml,: erb,: builder ]} в путях просмотра "/ path_to / app / views"

как я могу отобразить другое действие контроллера в представлении, но без отправки перенаправления клиенту? Я пробовал

<%=render :action => "index", :controller=>"controller" %>

но похоже, что не работает.

Ответы [ 4 ]

29 голосов
/ 19 мая 2011

Попробуйте сделать шаблон:

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

Или файл:

<%= render :template => "#{Rails.root}/app/controllers/controller/index" %> 

И я считаю, что вы должны сделать это через контроллер, насколько это более удобно:

def your_action
  ...
  render :action => :index
end
21 голосов
/ 17 августа 2011

Это хорошо работает для меня:

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
20 голосов
/ 19 мая 2011

Из Rails Guides page :

Использование render с: 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
0 голосов
/ 05 октября 2016

Если вы не хотите просто визуализировать view другого контроллера (/ модели), а вызываете action (метод), подумайте больше о рубиновом образе жизни - поместите этот метод в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
...