NoMethodError(用户

时间:2016-01-02 11:26:19

标签: ruby-on-rails

我使用Public Activity gem在我的应用上创建活动流。为此,我有这个设置。

我为我的应用设置了友情模型,

create_table "friendships", force: :cascade do |t|
  t.integer  "user_id"
  t.integer  "friend_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

模型看起来像这样,

belongs_to :user
belongs_to :friend, :class_name => "User"

这是我的用户模型,

has_many :friendships
has_many :friends, :through => :friendships
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
has_many :inverse_friends, :through => :inverse_friendships, :source => :user

我用Public Activity gem跟踪了我的电影模型,

include PublicActivity::Model
tracked owner: -> (controller, model) { controller && controller.current_user }
tracked recipient:  -> (controller, model) { controller && controller.current_user.friends }
tracked :params => {
  :title => :get_title,
  :poster => :get_poster
}

has_and_belongs_to_many :users

当我添加新电影,从而创建新活动时,我在rails控制台中收到此错误,

  

NoMethodError(未定义的方法primary_key' for User::ActiveRecord_Associations_CollectionProxy:Class): app/controllers/movies_controller.rb:19:in创建'

这指的是我在movies_controller中创建def,

def create
   @movie = Movie.find_or_create_by movie_params
   current_user.movies << @movie
   redirect_to :root
end

这里出了什么问题?

*根据要求提供电影参数*

private
def movie_params
  params.require(:movie).permit(
    :title,
    :image,
    :imdb_rating,
    :release_date,
    :movie_id,
    :backdrop
  )
end

1 个答案:

答案 0 :(得分:1)

好的,找到了!你的问题在这里:

tracked recipient:  -> (controller, model) { controller && controller.current_user.friends }

我认为tracked方法要求提供模型记录(或无),但您的controller.current_user.friends会返回关联,因此它没有primary_key。您可以将其更改为controller.current_user.friends.try(:first)以进行验证。