Сначала вам нужно исправить свои ассоциации.
Наличие has_one :message
и has_many :messages
просто сбивает с толку и, скорее всего, не будет работать так, как вы планировали.
Особое беспокойство вызывает:
belongs_to :ticket, inverse_of: :message
belongs_to :ticket, inverse_of: :messages
Как вы думаете, что делает этот код? Если вы догадались, что это создает две ассоциации, то вы ошибаетесь. Если у вас есть две ассоциации с одним и тем же именем, более поздняя ассоциация перезаписывает первую.
Я бы предложил вам объединить has_one
ассоциацию:
class Ticket < ApplicationRecord
has_many :messages
has_many :users, through: :messages
accepts_nested_attributes_for :messages
end
class Message < ApplicationRecord
belongs_to :user
belongs_to :ticket
validates_presence_of :user, :ticket
end
Если позже вы захотите добавить отдельную ассоциацию к последнему сообщению (или первому сообщению) для активной загрузки, вы хотите поместить столбец внешнего ключа в таблицу заявок и использовать belongs_to
.
class Ticket < ApplicationRecord
belongs_to :latest_message
has_many :messages, after_add: :update_latest_message!
has_many :users, through: :messages
accepts_nested_attributes_for :messages
private
def update_latest_message!(msg)
self.update!(latest_message: msg)
end
end
Однако эта оптимизация имеет смысл, только если у вас огромное количество сообщений и вам нужно загружать только последние версии. Я бы оставил это на потом. Преждевременная оптимизация - корень всего зла .
Что касается того, почему ваш код в настоящее время не работает, вы должны взглянуть на параметры:
{ "utf8"=>"✓", ...
"ticket"=>{
"category"=>"Miscellaneous - Project",
"deadline"=>"2019-01-13",
"message"=>{"body"=>"sdf"}}, # should be messages_attributes
"button"=>""
}
}
Вам необходимо настроить форму следующим образом:
<%= form.fields_for :messages do |message_form| %>
<div class="form-group row">
<div class="col-sm-12">
<%= message_form.label :body %>
<%= message_form.text_area :body, class: "form-control" %>
</div>
</div>
<% end %>
И засеять его в контроллере:
def new
@ticket = Ticket.new
@ticket.messages.new # seed the form
end
Даже если пользователь создает только одно сообщение за раз, вы все равно хотите использовать ассоциацию сообщений.