2017-08-22 12 views
0

peopleにはoccasionsからgiftsまでの数字が多く、その逆の場合はhas_many through:という関係があります。レコードがレコードに存在するかどうかを調べるhas_many〜

それがモデルに適切に設定されます:

person.rbは、このようなものです:

belongs_to :user 
has_many :gifts 
has_many :occasions, through: :gifts 

occasion.rbは、このようなものです:

belongs_to :user 
has_many :gifts 
has_many :people, through: :gifts 

gift.rbは、このようなものです:

belongs_to :user 
belongs_to :person 
belongs_to :occasion 

ビューでは、y軸にpeople、x軸にoccasions、適切なセルにgiftsのテーブルを作成しようとしています。私は私のgifts#indexビューでこれを持っている:

<table> 
    <tr> 
      <th>Recipient</th> 
     <% @occasions.each do |occasion| %> 
      <th><%= occasion.name %></th> 
     <% end %> 
    </tr> 
    <% @people.each do |person| %> 
     <tr> 
      <td> 
       <a href="#edit-recipient-popup" class="open-popup-link"> 
        <p><strong><%= person.name %></strong></p> 
       </a> 
      </td> 
      <% @occasions.each do |occasion| %> 
       <td> 
        <% if @gift.where(person_id: person.id, occasion_id: occasion.id) %> <<<<<<THIS LINE IS THE ISSUE 
         <%= gift.name %> 
        <% else %> 
         <h1> 
          <%= link_to new_gift_path do %> 
           <i class="icon ion-ios-add green"></i> 
          <% end %> <!-- link --> 
         </h1> 
        <% end %> <!-- if/else end --> 
       </td> 
      <% end %> <!-- occasions each --> 
     </tr> 
    <% end %> <!-- people each --> 
</table> 

ここに私の問題は、私がnilのためundefined method場所」を取得し、行に表示されている、ということである:NilClassビューで. I assume this is because you can't use controller logic like WHERE`が、私は方法がわからないんだけどそうでなければ、これをフレーズする。

誰でも私がこのタスクを成功裏に「railsy」のやり方で成功させる手助けをすることができますか?

+0

コントローラコードも追加できますか? –

答えて

1

編集:

は結果を検索結果がある場合は、その後

<% gift = Gift.where(person_id: person.id, occasion_id: occasion.id) %> 
    <% gift != [] %> 
     <%= gift.name %> 
    <% else %> 
     <h1> 
      <%= link_to new_gift_path do %> 
       <i class="icon ion-ios-add green"></i> 
      <% end %> <!-- link --> 
     </h1> 
    <% end %> 
+0

@giftはコントローラーで定義することはできません。表のセルからセルに変更されるので... – Liz

+0

何らかの理由で 'any'がエラーを投げたのですが、' if gift!= [] 'it作品! – Liz

+0

あなたの情報をありがとう、戻り値は配列クラスであり、おそらく<% if gift %>あなたの問題のために動作します。 – widjajayd

0
<% if @occasions.gifts && @occasions.gifts.where(person_id: person.id) %> 
0

これがnilの値との誤差を防ぐことができます、それを印刷し、私は「あなたができるためであると仮定ビュー内でコントローラのロジックを使用する

これは問題ではありません。 2つ目は、モデル上で呼び出されたばかりで、どこにあっても、コードベースのどこからでも呼び出せます(モデル上にある限り)。whereはコントローラロジックではなく、モデルロジックです。 。

nil@giftインスタンス変数が設定されていないため、エラーが発生しています。呼び出す前にこの変数を設定していますか?ブロックで

<% if @gift.where(person_id: person.id, occasion_id: occasion.id) %> <<<<<<THIS LINE IS THE ISSUE 
    <%= gift.name %> 
<% else %> 
    <h1> 
     <%= link_to new_gift_path do %> 
      <i class="icon ion-ios-add green"></i> 
     <% end %> <!-- link --> 
    </h1> 
<% end %> 

あなたの最初の問題は、あなたの@gift変数前述したように、あなたが<%= gift.name %>を書くときに、第2、あなたはその後、別の未設定のローカル変数giftに名前を呼んでいる、nilであるということです。

私はあなたが、これは「ので、私は同様に.find_by.whereを変更しているに気づいたかもしれませんが、あなたが

<% gift = occasion.gifts.find_by(person_id: person.id) %> 
<% if gift.present? %> 
    <%= gift.name %> 
<% else %> 
    .... 
<% end %> 

の線に沿って何かの後にあると仮定します。どこでコレクションが返されますか?あなたのコードを見て、あなたは単一のギフトレコードの名前を表示しようとしています。

関連する問題