#ruby-on-rails #ruby #models
#ruby-on-rails #ruby #Модели
Вопрос:
Это беспокоит меня уже несколько дней. У меня простая настройка:
class User < ActiveRecord::Base
has_many :inquiries, dependent: :destroy
end
class Inquiry < ActiveRecord::Base
belongs_to :user
has_many :entries, dependent: :destroy
end
class Entry < ActiveRecord::Base
belongs_to :inquiry
end
Идея состоит в том, чтобы сохранить запросы (тикеты), отправляемые пользователем, и сохранить записи (ответы) в другой модели с соответствующим отношением.
В представлении «Показать запрос» у меня есть форма, которая отправляется контроллеру записей со скрытым полем, содержащим идентификатор запроса.
= form_for @entry do |f|
= f.label :message, t('views.message')
= f.text_area :message
= f.hidden_field :inquiry_id, :value => @inquiry.id
.buttons
= f.submit t('views.submit')
И контроллер записей
def create
@entry = Entry.new(entry_params)
@inquiry = Inquiry.find(params[:entry][:inquiry_id])
@entry.inquiry = @inquiry
respond_to do |format|
if @entry.save
format.html { redirect_to @inquiry, notice: 'Entry was created succesfully' }
#format.json { render action: 'show', status: :created, location: @inquiry }
else
format.html { redirect_to @inquiry, error: 'Entry could not be created.' }
#format.json { render json: @inquiry.errors, status: :unprocessable_entity }
logger.warn "Entry could not be created: #{@entry.attributes.inspect}, is valid?: #{@entry.valid?}"
end
end
end
def entry_params
params.require(:entry).permit(:message, :inquiry_id)
end
Все параметры переданы правильно, но сохранить запись в базе данных не удается. Является действительным? возвращает false, даже если нет проверки и не отображаются ошибки. Чего мне здесь не хватает?
Редактировать
От регистратора:
Entry could not be created: {"id"=>nil, "created_at"=>nil, "updated_at"=>nil, "i
nquiry_id"=>2, "author"=>nil, "message"=>"This is a test", "employee"=>nil}, is
valid?: false
И пытается спасти!
irb(main):023:0> @entry.save!
ActiveRecord::RecordInvalid: translation missing: es.activerecord.errors.message
s.record_invalid
from C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4
.0.4/lib/active_record/validations.rb:57:in `save!'
from C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4
.0.4/lib/active_record/attribute_methods/dirty.rb:41:in `save!'
from C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4
.0.4/lib/active_record/transactions.rb:275:in `block in save!'
from C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4
.0.4/lib/active_record/transactions.rb:330:in `block in with_transaction_returni
ng_status'
from C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4
.0.4/lib/active_record/connection_adapters/abstract/database_statements.rb:213:i
n `block in transaction'
from C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4
.0.4/lib/active_record/connection_adapters/abstract/database_statements.rb:221:i
n `within_new_transaction'
from C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4
.0.4/lib/active_record/connection_adapters/abstract/database_statements.rb:213:i
n `transaction'
from C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4
.0.4/lib/active_record/transactions.rb:209:in `transaction'
from C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4
.0.4/lib/active_record/transactions.rb:327:in `with_transaction_returning_status
'
from C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4
.0.4/lib/active_record/transactions.rb:275:in `save!'
from (irb):23
from C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/railties-4.0.4
/lib/rails/commands/console.rb:90:in `start'
from C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/railties-4.0.4
/lib/rails/commands/console.rb:9:in `start'
from C:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/railties-4.0.4
/lib/rails/commands.rb:62:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'
Кстати, у меня нет проверок для ввода, и поля с нулевым значением разрешены. Я также пробовал заполнять все параметры, включая ручное присвоение идентификатора.
Комментарии:
1. Что / где находится
entry_params
?2. Скорее всего, это не связано, но вы можете немного почистить это:
@inquery = Inquiry.find(...); @entry = @inquiry.entries.new(entry_params)
затем удалите@entry.inquiry = @inquiry
3. @meagar извините, что я пропустил это. Только что отредактировано.
4. @meagar да, теперь он чище, но, как вы сказали, проблема сохраняется
5. Вы уверены, что ваши миграции верны и что вы их запустили? Что вы получаете на консоли, говоря
Entry.new.save!
. Попробуйте опубликоватьdb/schema.rb
. Черт возьми, сообщение об ошибке бессмысленно, потому что (по-видимому) язык установлен на испанский, и у вас нет определенных сообщений об ошибках на испанском.