Вопрос по ruby-on-rails, ruby, rails-models – Как создать ассоциацию между двумя моделями рельсов

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 / 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 как скрытое поле в форме?

Я отредактировал вопрос, включив в файл journal_entries / new форму, которая создает запись в журнале. Lee McAlilly
Хорошо, это работает правильно, если я добавлю user_id в форму, подобную этой: & lt;% = f.hidden_field: user_id,: value = & gt; current_user.id% & gt; `но я думал, что ассоциация должна справиться с этим для вас. Разве рельсы не должны назначать user_id через ассоциацию, или вам всегда нужно включать user_id в качестве скрытого поля в ваших формах? Lee McAlilly
да, вам нужен user_id в форме! DGM
Где вы устанавливаете пользователя для журнала? Опубликуйте этот код, пожалуйста Ismael Abreu
Можете ли вы опубликовать код в вашем JournalEntriesController # create? Jesse Wolgamott

Ваш Ответ

5   ответов
0

Вам нужно добавить user_id к вашемуattr_accessible Если вы просматриваете свои журналы, возможно, они предупреждают вас, что не могут массово их назначить.

Я отредактировал вопрос, чтобы включить новую модель journal_entry. Добавлениеuser_id кattr_accessible не работал. Lee McAlilly
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

Это должно работать!

Кроме того, обратите внимание, что я думаю, что это проблема безопасности, чтобы перечислить:user_id какattr_accessible, Вы не хотите, чтобы user_id был mass_assigned, верно?stephensclafani.com/2010/01/04/… Lee McAlilly
я добавил:user_id к моемуattr_accessible но он все еще говорит, что user_id не может быть пустым Lee McAlilly
Я должен был добавитьuser_id как скрытое поле в моей форме, как это<%= f.hidden_field :user_id, :value => current_user.id %> чтобы заставить его работать. Это конвенция рельсов? Lee McAlilly
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
    ..
Хорошо, это был действительно ответ. Мне нужно было добавить пользователя в действие create в journal_entries_controllerdef create @user = current_user @journal_entry = @user.journal_entries.build(params[:journal_entry]) if @journal_entry.save flash[:success] = "Journal entry created!" end Lee McAlilly
0

Итак, я получил это, добавив пользователя в действие create в моем 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% процентов :-), пропущено 1%, потому что переменная @user бесполезна, достаточно использовать current_user. удачи!
0

у вас все правильно на этот раз. Вы добавили ассоциацию пользователей в модель журнала, которая загружает пользователя в контроллер перед его отображением в представлении. Вам действительно нужны скрытые поля в вашей форме, которые вы добавили, так как вы используете протокол без сохранения состояния. В действии update / create дважды проверьте, что пользователь использует публикацию, и сохраните.

Я удалил скрытое поле из формы, и оно работает нормально. Это сообщение с правильным идентификатором user_id Lee McAlilly

Похожие вопросы