如何在两个导轨模型之间创建关联
这是一个新手问题,但我仍然在学习如何在两个导轨模型之间创建关联。我有一个用户模型和一个journal_entry模型。日记帐分录属于用户和用户has_many日记帐分录。我创建迁移看起来像这样:如何在两个导轨模型之间创建关联
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
处创建了一个新的日志条目,我只是一个验证错误,指出“用户不能为空”。所以user_id是不是被添加到该日记条目即使我登录并且在我的DB/schema.rb一个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 /新创建日记条目:
<%= 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添加为表单上的隐藏字段?
我敢打赌,这而忘像
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
..
好的,这确实是答案。我需要将用户添加到在journal_entries_controller创建操作'DEF创建 @user = CURRENT_USER @journal_entry = @ user.journal_entries.build(PARAMS [:journal_entry]) 如果@ journal_entry.save 闪光[:成功] =“创建日记条目!” end' – 2012-07-07 16:06:59
您需要将user_id添加到您的attr_accessible
调用中,如果您查看日志,可能会警告您无法对其进行批量分配。
我编辑了问题以包含新的journal_entry模型。将'user_id'添加到'attr_accessible'不起作用。 – 2012-07-06 21:42:34
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
这应该工作!
我在'attr_accessible'处添加了':user_id',但它仍然是说user_id不能为空 – 2012-07-06 21:40:24
我不得不在我的表单中添加'user_id'作为隐藏字段,如 current_user.id%>'为了得到它的工作。这是轨道公约? – 2012-07-07 15:52:17
另外,请注意,我认为将':user_id'列为'attr_accessible'是一个安全问题。你不想让user_id被mass_assigned,对吧? http://stephensclafani.com/2010/01/04/ruby-on-rails-secure-mass-assignment/ – 2012-07-07 16:14:12
好了,我通过将用户添加到创建操作在我journal_entries_controller.rb得到了这个工作。这里是我使用的代码,但这是“轨道方式”来做到这一点?
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
99%rails方式:-),缺少1%,因为@user变量没用,足以使用current_user。祝你好运! – 2012-07-09 13:25:06
这次你说得对。您将用户关联添加到日志模型,该模型将用户加载到控制器中,然后将其显示在视图中。 由于您使用的是无状态协议,因此您确实需要您添加的表单中的隐藏字段。 在更新/创建操作上,仔细检查用户发布是用户使用并保存。
我从表单中删除隐藏的字段,它工作正常。它使用正确的user_id进行发布 – 2012-07-07 17:03:02
你可以在JournalEntriesController中发布代码#create? – 2012-07-06 01:30:22
你在哪里设置用户到jornal?请将该代码发布 – 2012-07-06 01:32:14
我编辑了该问题以在创建日记条目的journal_entries/new上包含该表单。 – 2012-07-06 21:38:28