2

コントローラのこのコード

av = ActionView::Base.new(Rails::Configuration.new.view_path)
av.extend ApplicationHelper
content = av.render(:file => "show", :locals => { :user => @user })

とshow.html.erbにはlink_toヘルパー、オペコードエラーがあります

undefined method `url_for' for nil:NilClass

コントローラを追加 av.extend ActionController::UrlWriterしましたが、それでもエラーが発生します

undefined method `default_url_options' for ActionView::Base:Class
4

3 に答える 3

2

試す:

content = render_to_string(:file => "show", :locals => { :user => @user })
于 2013-01-17T15:03:57.183 に答える
0

通常、Rails で何かが非常に難しい場合は、理想的な角度から問題に取り組んでいないことが原因です。これをしないようにアドバイスする以外に、この質問に直接答えることはできません。理想的には、ビュー ロジックはコントローラーではなくビューにある必要があります。フラッシュ メッセージで link_to ヘルパーを使用するなど、いくつかのまれな例外を除いて (これは簡単に解決できます)、これらの問題は分離する必要があります。これは、これらの例外の 1 つではないようです。代わりに、次の (少し Rails に近い) 手法のいずれかをお勧めします。

オプション1:

show アクションのビューをレンダリングしようとしているようです。render :action => 'show'これは( docs )を使用して簡単に実行できます。これはアクションのコードを実行せず、そのビューを使用するだけです。

オプション 2

状況でオプション 1 が実行できない場合は、代わりに、次の手法のバリエーションを検討することもできます。通常どおり、デフォルト ビューをレンダリングします。ビューの既存のコンテンツをパーシャルに移動し、新しいコンテンツを独自のパーシャルに移動します。次に、ビューで、適切な条件 (この例では @user の存在) に基づいてパーシャルをレンダリングに切り替えるだけですrender :partial => @user ? 'new_content' : 'existing_content'。アプリケーションの構造によっては、show ビューと質問で参照されているアクションのビューから同じパーシャルをレンダリングするだけで、これをさらに簡素化できる場合があります。

アプリケーションのさまざまな要素を意図した関心事に分離しておくと、最小の驚きの原則に従うことで開発と保守が容易になるだけでなく、通常、アプリケーションのテストもはるかに容易になります。質問に答えられなくて申し訳ありません - とにかく、これがお役に立てば幸いです。

于 2014-04-03T07:16:25.463 に答える