我有一个 Rails API,我用它来创建帖子并将其提供给移动客户端。我正在尝试使用印象派 gem来跟踪基于user_id
. 使用起来似乎很简单,但我不断收到此错误:
NoMethodError (undefined method `id' for {"init"=>true}:Hash):
这是我的设置:我在我的Postsviews_count
表中添加了一个列,在模型中我有这个:
is_impressionable :counter_cache => true, :column_name => :views_count, :unique => :user_id
然后在我的PostsController中,我试图在 show 方法中创建印象(即视图),如下所示:
def show
...set @post...
impressionist(@post)
...return @post json...
end
我可以想到一些可能出错的地方导致错误。首先是我将 gem 迁移中的所有 id 类型更改为使用 UUID。结果是这样的:
class CreateImpressionsTable < ActiveRecord::Migration[6.0]
def self.up
create_table :impressions, id: :uuid, :force => true do |t|
t.string :impressionable_type
t.uuid :impressionable_id
t.uuid :user_id
t.string :controller_name
t.string :action_name
t.string :view_name
t.string :request_hash
t.string :ip_address
t.string :session_hash
t.text :message
t.text :referrer
t.text :params
t.timestamps
end
add_index :impressions, [:impressionable_type, :message, :impressionable_id], :name => "impressionable_type_message_index", :unique => false, :length => {:message => 255 }
add_index :impressions, [:impressionable_type, :impressionable_id, :request_hash], :name => "poly_request_index", :unique => false
add_index :impressions, [:impressionable_type, :impressionable_id, :ip_address], :name => "poly_ip_index", :unique => false
add_index :impressions, [:impressionable_type, :impressionable_id, :session_hash], :name => "poly_session_index", :unique => false
add_index :impressions, [:controller_name,:action_name,:request_hash], :name => "controlleraction_request_index", :unique => false
add_index :impressions, [:controller_name,:action_name,:ip_address], :name => "controlleraction_ip_index", :unique => false
add_index :impressions, [:controller_name,:action_name,:session_hash], :name => "controlleraction_session_index", :unique => false
add_index :impressions, [:impressionable_type, :impressionable_id, :params], :name => "poly_params_request_index", :unique => false, :length => {:params => 255 }
add_index :impressions, :user_id
end
def self.down
drop_table :impressions
end
end
第二个是,当我最初安装 gem 时,我看到了一个不同的错误,比如
undefined method `cookie_value'
正如这篇文章中所建议的,我通过安装 gem 的特定提交来解决这个问题。
对可能发生的事情有任何想法吗?
更新
这是我专门用于将帖子标记为已查看的一种稍微不同的方法的堆栈跟踪。
方法:
def mark_as_viewed
impressionist(@post)
end
堆栈跟踪:
app/controllers/api/posts_controller.rb:10:in `mark_as_viewed'
Started POST "/api/posts/3f278426-3c09-4b9d-b56d-9668ce559ebb/view" for ::1 at 2021-02-18 09:12:40 -0500
(1.4ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Processing by Api::PostsController#mark_as_viewed as JSON
Parameters: {"id"=>"3f278426-3c09-4b9d-b56d-9668ce559ebb", "post"=>{}}
User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."email" = $1 AND "users"."hidden_id" = $2 LIMIT $3 [["email", "testing@example.com"], ["hidden_id", "YJcrbdHDZqeII2vq6TcvdM04zn42"], ["LIMIT", 1]]
↳ app/models/authentication_manager.rb:11:in `current_user'
Post Load (1.0ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT $2 [["id", "3f278426-3c09-4b9d-b56d-9668ce559ebb"], ["LIMIT", 1]]
↳ app/controllers/api/posts_controller.rb:83:in `set_post'
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."email" = $1 AND "users"."hidden_id" = $2 LIMIT $3 [["email", "testing@example.com"], ["hidden_id", "YJcrbdHDZqeII2vq6TcvdM04zn42"], ["LIMIT", 1]]
↳ app/models/authentication_manager.rb:11:in `current_user'
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."email" = $1 AND "users"."hidden_id" = $2 LIMIT $3 [["email", "testing@example.com"], ["hidden_id", "YJcrbdHDZqeII2vq6TcvdM04zn42"], ["LIMIT", 1]]
↳ app/models/authentication_manager.rb:11:in `current_user'
Completed 500 Internal Server Error in 78ms (ActiveRecord: 19.9ms | Allocations: 28661)
NoMethodError (undefined method `id' for {"init"=>true}:Hash):
app/controllers/api/posts_controller.rb:10:in `mark_as_viewed'