1

Rails アプリが間違ったパーシャルをレンダリングしている理由に困惑しています。2 つのパーシャルがあり、それぞれが異なるコントローラー (招待とゲスト コントローラー) に関連しています。1 つはユーザーに送信された招待の数を部分的にリストし、2 番目の部分は招待を確認したユーザーをリストします。さらに、2 番目の部分では、確認済みのゲストの簡単なプロフィールを確認することもできます。

何が起こっているかというと、ゲスト コントローラーevents/1/guests/に関連するリンクにアクセスすると、ゲスト プロファイルに関連する部分が表示されることを期待しています。代わりに、招待コントローラーに関連するパーシャルがレンダリングされます。招待とゲスト コントローラーはどちらも、イベントのネストされたリソースです。

以下は、私が取り組んできたコードです。ありがとう!

ルート

resources :events, only: [:new, :show, :create] do
    resources :invitations, only: [:new, :create, :show]
    resources :guests, only: :show
end

match '/events/:id/guests', to: 'guests#show'

ゲストコントローラー

def show
   @event = Event.find_by_id(params[:id])
   @guestlist = @event.invitations.where(accepted: true)
end

ビュー/ゲスト/show.html.erb

<% provide(:title, @event.eventname + " Guest List") %>
<h1> Guest list for <%= @event.eventname %> </h1>

<% if @event.invitations.any? %>
   <%= render @guestlist %>
<% end %>

ビュー/ゲスト/_guestlist.html.erb

<li>
<%= guestlist.name %> | <%= guestlist.occupation %> | 
    <%= guestlist.interests %>  
</li>

代わりに、次のパーシャルがレンダリングされています。

ビュー/招待状/_invitation.html.erb

<li>
<%= invitation.name %> | <%= invitation.email %> | 
<% if invitation.accepted == true %> <%= "Confirmed" %> <% else %> <%= "Pending" %> <% end %>
</li>
4

3 に答える 3

2

次のスニペットは、パーシャルを呼び出す正しい方法を示しています。

# app/views/guests/show.html.erb
<%= render :partial => 'guests/guestlist', :locals => {:guestlist => @guestlist} %>

パーシャルでインスタンス変数にアクセスする必要が@guestlistあるため、ローカルとして渡す必要があります。次に、パーシャルでguestlist、ローカル変数として使用できるようになります。

次に、パーシャル内で、ゲストリストのメンバーを反復処理する必要があります。

# app/views/guests/_guestlist.html.erb
<% guestlist.each do |guest| %>
    <li> 
         <%= guest.name %> | <%= guest.occupation %> | <%= guest.interests %>  
    </li>
<% end %>

アップデート:

invitationパーシャルをレンダリングしたパーシャルの OP の最初の呼び出し@guestlistが実際にはInvitationオブジェクトで構成されているため、<%= render @guestlist %>メソッドは実際には という名前のパーシャルを探していましたinvitation。正規の Rails ガイドから:

これには省略形もあります。@products が製品インスタンスのコレクションであると仮定すると、これを単に index.html.erb に記述して同じ結果を生成できます。

<h1>Products</h1> 
<%= render @products %>

Rails は、コレクション内のモデル名を見て、使用するパーシャルの名前を決定します。

このため、使用するパーシャルの名前を明示的に宣言する必要があります。そうしないと、ActionView はinvitationデフォルトでパーシャルを使用します。

于 2013-07-07T19:29:27.157 に答える
1

@guestlistタイプが のオブジェクトの場合Guest、デフォルトで render になります_guest.html.erb

だから、あなたはこれを試すことができます

<%= render 'guestlist' %>

変数@guestlistはパーシャルで自動的に使用可能になるため、ローカルで渡す必要はありません。

これがうまくいくことを願っています。

于 2013-07-07T19:29:55.110 に答える