将用户标识集成到Activerecord数据库中的新对象的创建中

时间:2015-07-21 16:50:47

标签: ruby-on-rails activerecord

创建一个简单的flashcard应用程序与一个有很多,属于关系:

card belongs_to :user user has_many :cards

由于AR惯例,已在卡表中设置了对user_id的验证以反映关联:

create_table "cards", force: :cascade do |t| t.string "word_text", null: false t.string "meaning_text", null: false t.integer "user_id", null: false end

现在,在创建新闪存卡时运行功能测试,遇到麻烦,因为我不知道如何确保新创建的对象中的user_id列被user.id填充...试过将此添加到我的表单中,但似乎没有任何效果...

```

<%= form_for @card do |f| %>
   <%= f.label :word_text %>
   <%= f.text_field :word_text %>

  <%= f.label :meaning_text %>
  <%= f.text_field :meaning_text %>

  <%= f.label :user_id %>
  <%= f.number_field :user_id %>

<%= f.submit "Create" %>

```

我知道这是错误,因为当我在rails console中输入@card.save!时出现此错误:

ActiveRecord::RecordInvalid: Validation failed: User can't be blank

如果我已登录好,是否应自动使用用户ID创建新对象?

对rails很新,似乎无法解读这里发生的事情。任何帮助将非常感激。谢谢!

1 个答案:

答案 0 :(得分:2)

你的CardsController中可能有create这样的动作:

def create
  card = Card.new(card_params)
  if card.save
    redirect_to some_path
  else
    redirect_to some_other_path
  end
end

您应该在此创建操作中附加用户的ID,而不是在表单中询问用户ID的内容(也不会按照建议添加hidden_field)。

def create
  card = Card.new(card_params.merge(user_id: current_user.id))
  if card.save
    redirect_to some_path
  else
    redirect_to some_other_path
  end
end