2016-06-14 3 views
0

初心者から上級者まで、遊んでいて、コンベンションについての何かを理解しようとしました& MVCアプローチ。元のオブジェクトの背景から来て、レールパラダイムで私を悩ます何かがあり、私は根拠/最善のアプローチについての良い提案を見つけることができません。Rails再利用:コントローラーがパーシャル内で再利用されないのはなぜですか?

部分はレンダリングビューでのみ表示されますか?それは 'コントローラを呼び出す'ことはありません。

私が説明してみましょう:私はしたい場合は3つのオブジェクト、3つのコントローラとビューの3セット

  • ユーザー
  • 住所
  • ユーザ履歴

を持っているホームページを言います私が作成しなければならないすべてのモデルのコンテンツを実際に表示しているホームページにログインしているホームページには、「サイトコントローラ」とビューがあります。これはホーム、ページですが、さまざまな部分/フォームを介してアクセスされるユーザー、アドレス、ユーザー履歴などがあります。

テストでは、すべてのビューとデータが機能するように3組のテストをセットアップしました。 しかし、統合されたホームページでは、コントローラのロジックを "サイト"中央/ホームページに複製する必要があるようです。

「オブジェクトの世界」では、私の脳は、ビューをサポートするためにコントローラ呼び出しを組み込むことができ、アドレス、ユーザー、およびユーザー履歴コントローラを再利用できることを示しています。 * これがどう機能するかについては、完全にわかりません。私はミスを理解してい何の専門家や方向のウェルカム景色。*

これらの例は、再施行私のポイントすぎと洞が解決

  1. reuse the view only
  2. to reuse a controller use a super class
を提供するように見えるようです

乾杯 ベン

答えて

1

いいえ、部分はコントローラを呼び出しません。コントローラで必要なオブジェクトをインスタンス化します。したがって、アドレスを部分的にレンダリングする場合は、コントローラ内のアドレスを取得します。

あなたはすべてのページにすべての3が必要な場合は、それらのアクション

module GetStuff 
    extend ActiveSupport::Concern 

    included do 
    before_action :set_user 
    before_action :set_address 
    end 

    def set_user 
    @user = # code for getting user 
    end 
end 

class UsersController 
    include GetStuff 
end 

それとも、あなたは、単にそこに彼らのために行動する前に設定することができ、アプリケーションコントローラ(から継承すると仮定する前に持っているコントローラ上の問題を作成することもできますが、

頻繁に使用する場合は、メソッドをアプリケーションコントローラに設定し、ヘルパーメソッドを設定して、ビューとコントローラからメソッドにアクセスできるようにすることができます。

class ApplicationController 
    def current_user 
    @current_user = #code to get user 
    end 
    helper_method :current_user 
end 

# Some view 
<% if current_user %> 
    <%= current_user.username %> 
<% end %> 

それとも

module ApplicationHelper 
    def current_user 
    @current_user = #code to get user 
    end 
end 

それとも、おそらくアドレスがあまりにもあなたがファサードを作成することができますし、単にあなたのコントローラでこれをインスタンス化し、ユーザーにリンクされているヘルパーのメソッドを持つことができ

class UserController 
    def show 
    @user_facade = UserFacade.new(User.find(params[:id]) 
    end 
end 

class UserFacade 
    attr_reader :user 

    def initialize(user) 
    @user = user 
    end 

    def address 
    @address ||= user.address 
    end 

    def user_history 
    @user_history ||= user.history 
    end 
end 

# users/show.html.erb 

<%= render @user_facade.user %> 
<%= render @user_facade.address %> 
<%= render @user_facade.user_history %> 
+0

おかげJ- dexx - (戻ってこないことに対する謝罪、この「楽しい」は私のためのパートタイムのギグです)。これは役に立ちました。私はさまざまなオプションを使い、UserFacadeのアプローチが好きです。 – Ben

+0

心配はいりません。さらに、ファサード内のメソッドを委譲して、 '@ user_facade.user.name'ではなく' @ user_facade.name'を行うことができます –

関連する問題