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" %>
но кажется, что он не работает.
Ответы
Ответ 1
Попробуйте создать шаблон:
<%= render :template => "controller/index" %>
Или файл:
<%= render :template => "#{Rails.root}/app/controllers/controller/index" %>
И я считаю, что вы должны сделать это через контроллер, насколько это удобнее:
def your_action
...
render :action => :index
end
Ответ 2
Это хорошо работает для меня:
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
Ответ 3
В Rails Guides страница:
Использование 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
Ответ 4
Если вы не хотите просто отображать view
другого контроллера (/model), но вызывая метод 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