Ruby on rails 用户id在rails关联上为零

Ruby on rails 用户id在rails关联上为零,ruby-on-rails,Ruby On Rails,我有一个user模型和一个shout模型。我正在尝试将用户与呼喊关联。在创建shouts表时,我没有进行这种关联,所以我必须运行新的迁移。下面是我的表格,每一个的型号,以及当我从控制台运行命令试图找到一个呼喊的用户id时的输出。你能看出我做错了什么吗 模式: create_table "shouts", force: :cascade do |t| t.string "title" t.text "description" t.integer "user_id"

我有一个
user
模型和一个
shout
模型。我正在尝试将用户与呼喊关联。在创建shouts表时,我没有进行这种关联,所以我必须运行新的迁移。下面是我的表格,每一个的型号,以及当我从控制台运行命令试图找到一个呼喊的用户id时的输出。你能看出我做错了什么吗

模式:

create_table "shouts", force: :cascade do |t|
    t.string  "title"
    t.text    "description"
    t.integer "user_id"
  end

  add_index "shouts", ["user_id"], name: "index_shouts_on_user_id"

  create_table "users", force: :cascade do |t|
    t.string   "email",           null: false
    t.string   "password_digest", null: false
    t.datetime "created_at",      null: false
    t.datetime "updated_at",      null: false
    t.string   "username"
  end
用户模型:

class User < ActiveRecord::Base
  validates :email, presence: true, uniqueness: true
  validates :password_digest, presence: true
  has_many :shouts
end
结束

一些测试代码:

> Shout.find(4)
> #<Shout id: 4, title: "four", description: "four", user_id: nil>
迁移文件:

class AddUserRefToShouts < ActiveRecord::Migration
  def change
    add_reference :shouts, :user, index: true, foreign_key: true
  end
end
类AddUserRefToShouts如果你不想遵循评论中建议的方法,这里有几个公认的黑客选项(但它们会起作用)。您可以将用户_id作为隐藏字段传递,以便将其包含在参数中,也可以在创建操作中明确设置它

如果要作为隐藏字段传递,请在您的表单上添加:

<%= f.hidden_field :user_id, value: current_user.id %>

如果您不想遵循评论中建议的方法,这里有几个公认的黑客选项(但它们会起作用)。您可以将用户_id作为隐藏字段传递,以便将其包含在参数中,也可以在创建操作中明确设置它

如果要作为隐藏字段传递,请在您的表单上添加:

<%= f.hidden_field :user_id, value: current_user.id %>

您的迁移是什么样子的?2) 您在何处(如有)向用户分配呼叫,或反之亦然?看起来您在数据库中已有shouts,然后在迁移中添加了shouts.user\u id列,但从未填写这些shouts的user\u id。您能说明如何创建
shout
记录吗?您必须创建关联。e、 g.
user.shouts.create(title:'four',description:'four')
它应该分配用户id。@d\ethier返回
user.shouts.create(title:'four',description:'four')nomethoder错误:未定义的方法
shouts',@ZachDennis我添加了迁移文件以供参考。2) 我在排除故障时想到了这一点,所以我关闭了服务器,重置了数据库,创建了一个用户并发出了呼喊,但它仍然返回nil。@Jbur43,您想调用
呼喊。在用户实例上创建
,而不是在用户类本身上创建。这就是@d_ethier的建议。否则,在创建消息时必须显式地传入
user/user\u id
。例如,
user=user.create;user.shouts.create(title:'four',description:'four')
user=user.create;Shout.create(user:user)
您的迁移看起来像什么?2) 您在何处(如有)向用户分配呼叫,或反之亦然?看起来您在数据库中已有shouts,然后在迁移中添加了shouts.user\u id列,但从未填写这些shouts的user\u id。您能说明如何创建
shout
记录吗?您必须创建关联。e、 g.
user.shouts.create(title:'four',description:'four')
它应该分配用户id。@d\ethier返回
user.shouts.create(title:'four',description:'four')nomethoder错误:未定义的方法
shouts',@ZachDennis我添加了迁移文件以供参考。2) 我在排除故障时想到了这一点,所以我关闭了服务器,重置了数据库,创建了一个用户并发出了呼喊,但它仍然返回nil。@Jbur43,您想调用
呼喊。在用户实例上创建
,而不是在用户类本身上创建。这就是@d_ethier的建议。否则,在创建消息时必须显式地传入
user/user\u id
。例如,
user=user.create;user.shouts.create(title:'four',description:'four')
user=user.create;Shout.create(用户:用户)
class AddUserRefToShouts < ActiveRecord::Migration
  def change
    add_reference :shouts, :user, index: true, foreign_key: true
  end
end
<%= f.hidden_field :user_id, value: current_user.id %>
def create
  @shout = Shout.new(shout_params)
  @shout.user_id = current_user.id
  @shout.save
end