1

これは初心者の質問ですが、レールで 2 つのモデル間の関連付けを作成する方法をまだ学んでいます。ユーザー モデルと 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

私の User モデルは次のようになります。

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 を追加する必要がありますか?

4

5 に答える 5

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
    ..
于 2012-07-06T22:26:35.173 に答える
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

これはうまくいくはずです!

于 2012-07-06T03:40:57.517 に答える
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
于 2012-07-07T16:09:15.540 に答える
0

呼び出しにuser_id を追加する必要がありattr_accessibleます。ログを見ると、一括割り当てできないことが警告されている可能性があります。

于 2012-07-06T01:39:42.693 に答える
0

今回は正しいです。ビューに表示する前にコントローラーにユーザーをロードするジャーナルモデルにユーザーの関連付けを追加しました。ステートレス プロトコルを使用しているため、フォームに追加した隠しフィールドが必要です。更新/作成アクションで、ユーザーの投稿が使用しているユーザーであることを再確認して保存します。

于 2012-07-07T16:17:51.560 に答える