Многоуровневые отношения Rails

#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 . Черт возьми, сообщение об ошибке бессмысленно, потому что (по-видимому) язык установлен на испанский, и у вас нет определенных сообщений об ошибках на испанском.