Подтвердить что ты не робот

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" %>

но кажется, что он не работает.

4b9b3361

Ответ 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