0

User モデル、Post モデル、Interest モデルがあります。


User has_many posts through interests

User has_many interests

Post has_many users through interests

Post has_many interests

Interest belongs to Post

Interest belongs to User  

Application_Controller は次のとおりです。

class ApplicationController < ActionController::Base
  before_filter :login_from_cookie
  before_filter :find_user_interests
  helper :all # include all helpers, all the time
  session :session_key => '_blah_session'

  include AuthenticatedSystem   

  def find_user_interests
    @user_interests = current_user ? current_user.interests : []  
    true
  end

end

Application.html.erb には次のようなものがあります。

<%= render :partial => "users/interests", :object => @user_interests %>

_interests.html.erb パーシャルは次のとおりです。

ul
  <% unless current_user.nil? then -%>  
    <% @user_interests.each do |interest| -%>
      li<%= interest.post.title %>/li
    <% end %>
  <% end -%>   
/ul    

localhost:3000/posts/1 ではパーシャルが正常に表示されますが、localhost:3000/posts ではエラーが発生するため、上記の _interests.html.erb パーシャルundefined method 'title' for nil:NilClassの行にエラーが発生します 。li<%= interest.post.title %>/li

一体何が問題になるのでしょうか?

ティア

4

1 に答える 1

2

これは、一方の興味がもう一方の端に関連付けられた投稿を持っていないことを意味します。削除された可能性が高いです。これは、次の方法で防止できた可能性があります。

class Post < ActiveRecord::Base
  has_many :interests, :dependent => :destroy
end

それまでの間、データベース内のオーファンをクリーンアップする必要があります。

編集:これはすでにモデルに含まれていると主張していますが、そうであった場合、エラーが示すように孤立した興味をどのように持つことができるかは明確ではありません。従属節を追加する前に作成された可能性がありますか? 繰り返しますが、SQL 経由でオーファンを削除してから、もう一度やり直してください。後で問題が再発する場合は、どこかでコールバックなしで削除する必要があります。

サイズのお悩みについて。を使用している可能性がありますcurrent_user.interests.count。これは、Rails 関連付けのマジックによるものです。countSQL を実行する Rails アソシエーションの特別なメソッドです。 lengthは、配列内のアイテムの数を示す単なる配列メソッドです。Rails の関連付けにはいくつかの特別なメソッドがありますが、残りのメソッドは透過的に配列オブジェクトに渡されます。

さらなる批判: パス:object => @user_interestsすると、パーシャルの名前で変数が設定されます。interestsしたがって、部分的にローカル変数を参照できます。ただし、@user_interests を参照しているため、オブジェクトを渡す必要はありません。他のすべてが等しい場合、オブジェクトを渡してローカル変数を使用する方がおそらく優れています(より明示的で、関数型プログラミングスタイルに近い)が、この場合はそれを利用していません。

最後に、スタイルに関しては、完全なコンテキストがないため間違っている可能性がありますが、一般的に、ログインしているユーザーがいない場合は、user_interests を空の配列に設定するのではなく、logged_in 条件をテンプレートに配置します。これにより、テンプレートで current_user.interests.count を参照し、@user_interests に (ページネーションなどで) 表示される興味を個別に設定できます。

于 2010-04-02T04:59:12.743 に答える