web-dev-qa-db-ja.com

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

しかし、それは機能していないようです。

26
Mihai

テンプレートをレンダリングしてみてください:

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

またはファイル:

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

そして、私はあなたがそれがより便利である限り、あなたはそれをコントローラを通してレンダリングするべきだと信じています:

def your_action
  ...
  render :action => :index
end
30
fl00r

これは私にとってうまくいきます:

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
21
gene tsai

Railsガイドから page

:actionでrenderを使用することは、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
20
Marek Sapota

他のコントローラー(/モデル)のviewをレンダリングするだけでなく、action(メソッド)を呼び出す場合は、Ruby生き方-このメソッドを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
0
halfbit