2012-07-06 122 views
1

这是一个新手问题,但我仍然在学习如何在两个导轨模型之间创建关联。我有一个用户模型和一个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添加为表单上的隐藏字段?

+0

你可以在JournalEntriesController中发布代码#create? – 2012-07-06 01:30:22

+0

你在哪里设置用户到jornal?请将该代码发布 – 2012-07-06 01:32:14

+0

我编辑了该问题以在创建日记条目的journal_entries/new上包含该表单。 – 2012-07-06 21:38:28

回答

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 
    .. 
+0

好的,这确实是答案。我需要将用户添加到在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

0

您需要将user_id添加到您的attr_accessible调用中,如果您查看日志,可能会警告您无法对其进行批量分配。

+0

我编辑了问题以包含新的journal_entry模型。将'user_id'添加到'attr_accessible'不起作用。 – 2012-07-06 21:42:34

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 

这应该工作!

+0

我在'attr_accessible'处添加了':user_id',但它仍然是说user_id不能为空 – 2012-07-06 21:40:24

+0

我不得不在我的表单中添加'user_id'作为隐藏字段,如<%= f.hidden_​​field:user_id ,:value => current_user.id%>'为了得到它的工作。这是轨道公约? – 2012-07-07 15:52:17

+0

另外,请注意,我认为将':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

0

好了,我通过将用户添加到创建操作在我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 
+1

99%rails方式:-),缺少1%,因为@user变量没用,足以使用current_user。祝你好运! – 2012-07-09 13:25:06

0

这次你说得对。您将用户关联添加到日志模型,该模型将用户加载到控制器中,然后将其显示在视图中。 由于您使用的是无状态协议,因此您确实需要您添加的表单中的隐藏字段。 在更新/创建操作上,仔细检查用户发布是用户使用并保存。

+0

我从表单中删除隐藏的字段,它工作正常。它使用正确的user_id进行发布 – 2012-07-07 17:03:02

相关问题