如何创建两条轨道模型之间的关联(How to create an association betwe

2019-06-26 01:56发布

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

Answer 1:

我敢打赌,那而忘像

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


Answer 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

这应该工作!



Answer 3:

您需要USER_ID添加到您的attr_accessible电话,如果你看看你的日志,它可能是警告你,它不能大量出让。



Answer 4:

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


Answer 5:

你是不是正确的这个时候。 添加的用户关联,它加载在控制器中的用户在视图中显示它之前的日志模式。 你需要在其中添加,因为你使用的是无状态协议在窗体隐藏字段。 在更新/创建行动,仔细检查该用户发布的使用和保存用户。



文章来源: How to create an association between two rails models