Rails 3 отрисовывает действие с другого контроллера

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

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

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

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

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


person Mihai    schedule 18.05.2011    source источник
comment
у вас есть index.html.erb в views/your_controller/?   -  person Andrei S    schedule 19.05.2011
comment
Почему бы не использовать перенаправление на правильное действие контроллера?   -  person Daniel X Moore    schedule 10.12.2011
comment
Потому что логика действий может быть совершенно разной, и единственное общее между этими действиями — это вид.   -  person Arsen7    schedule 26.08.2013


Ответы (4)


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

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

Или файл:

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

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

def your_action
  ...
  render :action => :index
end
person fl00r    schedule 18.05.2011
comment
Я пытаюсь использовать render:template, но визуализирую html, и мне нужно отобразить метод индекса, потому что метод индекса получает некоторые данные из БД, необходимые для этого представления. - person Mihai; 19.05.2011
comment
fl00r прав, лучше всего управлять этим из контроллера. Обратите внимание, что есть встроенный запасной вариант, если он не может найти контроллер/индекс, он отображает приложение/индекс. Поэтому, если есть страницы (не частичные), которые должны отображаться с разных контроллеров, поместите их в app/views/application. - person Yorick Sijsling; 19.03.2013

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

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
person gene tsai    schedule 16.08.2011
comment
Это сработало и для меня, но мне нужно было добавить c.process_action(action), чтобы мой before_actions сработал. - person Emerson; 13.08.2014
comment
Черт, это четкий хак. Большое спасибо! - person Abhinav Pandey; 27.04.2015

На странице руководств по Rails:

Использование render с :action — частый источник путаницы для новичков в Rails. Указанное действие используется для определения того, какое представление отображать, но Rails не запускает какой-либо код для этого действия в контроллере. Любые переменные экземпляра, которые вам нужны в представлении, должны быть установлены в текущем действии перед вызовом рендеринга.

Короче говоря, вы не можете отобразить другое действие, вы можете отобразить только другой шаблон. Вы можете получить общий код и переместить его в метод в контроллере приложения. Вы также можете попробовать что-то в этом роде, если вы действительно не можете структурировать свой код каким-либо другим способом:

# 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
person Marek Sapota    schedule 18.05.2011

Если вы не хотите просто отображать 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
person halfbit    schedule 05.10.2016