创建一个简单的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很新,似乎无法解读这里发生的事情。任何帮助将非常感激。谢谢!
答案 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