这是一个新手问题,但我还在学习如何在rails中创建两个模型之间的关联。我有一个用户模型和一个journal_entry模型。日记帐分录属于用户,用户拥有多个日记帐分录。我创建的迁移看起来像这样:
class AddJournalEntriesToUsers < ActiveRecord::Migration
def change
add_column :journal_entries, :user_id, :integer
end
end
class AddIndexToJournalEntries < ActiveRecord::Migration
def change
add_index :journal_entries, [:user_id, :created_at]
end
end
这是我的用户模型的样子:
class User < ActiveRecord::Base
authenticates_with_sorcery!
attr_accessible :email, :password, :password_confirmation
has_many :journal_entries, dependent: :destroy
validates_confirmation_of :password, :message => "should match confirmation", :if => :password
validates_length_of :password, :minimum => 3, :message => "password must be at least 3 characters long", :if => :password
validates_presence_of :password, :on => :create
validates_presence_of :email
validates_uniqueness_of :email
end
这就是我的journal_entry模型:
class JournalEntry < ActiveRecord::Base
attr_accessible :post, :title, :user_id
belongs_to :user
validates :user_id, presence: true
default_scope order: 'journal_entries.created_at DESC'
end
但是当我在/journal_entries/new
创建一个新的日记条目时,我只是一个验证错误,上面写着“用户不能为空”。所以即使我已经登录并且我的db / schema.rb中有user_id列,user_id也没有被添加到日记条目中:
create_table "journal_entries", :force => true do |t|
t.string "title"
t.text "post"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.integer "user_id"
end
此外,这是我在journal_entries / new上使用的表单,用于创建日记帐分录:
<%= form_for(@journal_entry) do |f| %>
<% if @journal_entry.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@journal_entry.errors.count, "error") %> prohibited this journal_entry from being saved:</h2>
<ul>
<% @journal_entry.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :title %><br />
<%= f.text_field :title %>
</div>
<div class="field">
<%= f.label :post %><br />
<%= f.text_area :post %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
我在这里缺少什么?我是否需要将user_id添加为表单上的隐藏字段?
答案 0 :(得分:3)
我打赌,你忘了像
这样的东西def create
@journal_entry = @user.journal_entries.build(params[:journal_entry])
# @journal_entry = current_user.journal_entries.build(params[:journal_entry])
if @journal_entry.save
..
答案 1 :(得分:2)
journal_entry模型应该看起来像
class JournalEntry < ActiveRecord::Base
attr_accessible :post, :title, :user_id
belongs_to :user
validates :user_id, presence: true
default_scope order: 'journal_entries.created_at DESC'
end
这应该有效!
答案 2 :(得分:0)
您需要在attr_accessible
电话中添加user_id,如果查看日志,可能会警告您无法批量分配。
答案 3 :(得分:0)
好的,所以我通过将用户添加到我的journal_entries_controller.rb中的create动作来实现这一点。这是我使用的代码,但是这是“轨道方式”吗?
def create
@user = current_user
@journal_entry = @user.journal_entries.build(params[:journal_entry])
if @journal_entry.save
flash[:success] = "Journal entry created!"
end
end
答案 4 :(得分:0)
这次你说得对。您已将用户关联添加到日记模型,该日记模型将用户加载到控制器中,然后在视图中显示它。 您确实需要添加表单中的隐藏字段,因为您使用的是无状态协议。 在更新/创建操作上,仔细检查用户发布是否是用户使用并保存。