Rails выбора формы для таблицы соединений производит ActiveRecord :: AssociationTypeMismatch - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь настроить ввод данных для базы данных, которая содержит, например, проекты.Проекты могут быть частью серии, иметь несколько кураторов и т. Д.

Я либо отображаю форму серии с:

<%= f.collection_select :series, Series.order('word asc'), :id, :word, {}, {:class => 'select-field-style'} %>

с правильным стилем, но при отправке я получаю

ActiveRecord::AssociationTypeMismatch in Admin::ProjectsController#update
Series(#2212122800) expected, got String(#2183812080)

с

<%= f.select :series, Series.all.collect{ |p| [ p.word, p.id ]}, :include_blank => true, :class => "select-field-style" %>

CSS не применяется, но мне удается получить пустую опцию.Submit выдает тот же ответ.

Для кураторов

<%= f.select :curators, options_for_select(Author.all.map{|c| [c.name, c.id]}, f.object.curators), {}, {:class => "form-control selectpicker", :include_blank => true, :multiple => true} %>

создает поле с несколькими вариантами выбора с моим пользовательским стилем и при отправке я получаю похожую ошибку

ActiveRecord::AssociationTypeMismatch in Admin::ProjectsController#update
Author(#2214244880) expected, got String(#2183812080)

Мне нужно иметь возможность применить свой собственный CSS к селектору, иметь возможность single , множественный и пробел .Формы не работают, и ни одна версия не разрешает все параметры.

Эти отношения устанавливаются через таблицы соединений.Мои модели:

Модель проекта

class Project < ActiveRecord::Base
  attr_accessible :series, :curators

# Associations 
  has_and_belongs_to_many :curators, :class_name => "Author", :join_table => "projects_curators"
  has_and_belongs_to_many :series, :join_table => "projects_series" 
end

Модель серии

class Series < ActiveRecord::Base
  attr_accessible :word

# Associations
  has_and_belongs_to_many :projects, :join_table => "projects_series" 

конец

Таблица кураторов

class ProjectsCurator < ActiveRecord::Base  
  attr_accessible :project_id, :author_id

# Associations
  belongs_to :project
  belongs_to :author
end

Авторская модель

class Author < ActiveRecord::Base
  attr_accessible :name

# Associations
  has_and_belongs_to_many :projects, :join_table => "projects_curators"
end

Обновление

Благодаря ответу @ xploshioOn Я являюсьТеперь можно правильно выбрать нужные параметры выбора.

<%= f.select(:series, Series.order('word asc').map{|s| [s.word, s.id]}, {:include_blank => false}, {:class => 'select-field-style'}) %>

Отображение меню выбора с помощью пользовательского CSS.

<%= f.select(:curators, Author.order('name asc').map{|s| [s.name, s.id]}, {:include_blank => true}, {:class => "select-field-style", :multiple => true}) %>

Отображение меню выбора с пользовательским CSS, несколькими вариантами выбора и пустым.

К сожалению, при отправке я все еще получаю:

ActiveRecord::AssociationTypeMismatch in Admin::ProjectsController#update
Series(#2285826200) expected, got String(#2257413120)

и

Author(#2286926340) expected, got String(#2257413120)

Странно:

<%= f.select(:curators, Author.order('name asc').map{|s| [s.name, s.id]}, {:include_blank => true}, {:class => "select-field-style", :multiple => true}) %>

имеет ожидаемый результат, в то время как

<%= f.select(:curators, Author.order('name asc').map{|s| [s.name, s.id]}, {:include_blank => true, :multiple => true}, {:class => "select-field-style"}) %>

Почему?И как я могу получить отправку на работу?

Обновление 2

Форма для серии и большинство других форм теперь работают как задумано.Формы, которые связаны с отношениями habtm через таблицы соединений и имена классов, пока не работают.

Некоторый контекст: в этих случаях мне нужно связать проекты с организаторами, кураторами, сторонниками и т. Д. Отношения между следующими моделями:

Project.rb - projects_curator.rb - автор.rb

Project.rb - projects_supporter.rb - institu.rb

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

С помощью формы выбора, упомянутой выше, я получаю следующую ошибку при отправке

Started PUT "/admin/projects/1" for 127.0.0.1 at Wed Dec 05 20:03:31 +0100 2018
Processing by Admin::ProjectsController#update as HTML
  Parameters: {"project"=>{"place"=>"Moon", "hero_id"=>"1", "name"=>"Rocket", "year"=>"1492", "description"=>"And now the news.", "curators"=>["", "14"], "category_id"=>"2", "project_id"=>"1", "series_ids"=>["", "3"]}, "utf8"=>"✓", "commit"=>"Save", "authenticity_token"=>"some_token", "id"=>"1"}
  Project Load (0.3ms)  SELECT `projects`.* FROM `projects` WHERE `projects`.`id` = ? LIMIT 1  [["id", "1"]]
  SQL (0.1ms)  BEGIN
   (0.1ms)  ROLLBACK
Completed 500 Internal Server Error in 3ms

ActiveRecord::AssociationTypeMismatch (Author(#2302596480) expected, got String(#2274315260)):
  app/controllers/admin/projects_controller.rb:28:in `update'


  Rendered /Users/account/.rvm/gems/ruby-version@app/gems/actionpack-x.x.x/lib/action_dispatch/middleware/templates/rescues/_trace.erb (0.6ms)
  Rendered /Users/account/.rvm/gems/ruby-version@app/gems/actionpack-x.x.x/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.8ms)
  Rendered /Users/account/.rvm/gems/ruby-version@app/gems/actionpack-x.x.x/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (8.3ms)

Последняя часть трассировки:

activerecord (x.x.x) lib/active_record/associations/association.rb:204:in `raise_on_type_mismatch'
activerecord (x.x.x) lib/active_record/associations/collection_association.rb:318:in `replace'
activerecord (x.x.x) lib/active_record/associations/collection_association.rb:318:in `each'
activerecord (x.x.x) lib/active_record/associations/collection_association.rb:318:in `replace'
activerecord (x.x.x) lib/active_record/associations/collection_association.rb:41:in `writer'
activerecord (x.x.x) lib/active_record/associations/builder/association.rb:51:in `curators='
activerecord (x.x.x) lib/active_record/attribute_assignment.rb:85:in `send'
activerecord (x.x.x) lib/active_record/attribute_assignment.rb:85:in `assign_attributes'
activerecord (x.x.x) lib/active_record/attribute_assignment.rb:78:in `each'
activerecord (x.x.x) lib/active_record/attribute_assignment.rb:78:in `assign_attributes'
activerecord (x.x.x) lib/active_record/persistence.rb:212:in `update_attributes'
activerecord (x.x.x) lib/active_record/transactions.rb:295:in `with_transaction_returning_status'
activerecord (x.x.x) lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
activerecord (x.x.x) lib/active_record/transactions.rb:208:in `transaction'
activerecord (x.x.x) lib/active_record/transactions.rb:293:in `with_transaction_returning_status'
activerecord (x.x.x) lib/active_record/persistence.rb:211:in `update_attributes'
app/controllers/admin/projects_controller.rb:28:in `update'
actionpack (x.x.x) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
actionpack (x.x.x) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
actionpack (x.x.x) lib/abstract_controller/base.rb:167:in `process_action'

Относительное действие от projects_controller является стандартным:

def update
    @project = Project.find(params[:id])
    if @project.update_attributes(params[:project])
      flash[:notice] = 'project was successfully updated.'
      redirect_to :action => 'show', :id => @project
    else
      @page_title = 'Edit project'
      render :action => 'edit'
    end
  end 

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Я наконец нашел решение для несоответствия также благодаря ответу xploshioOn.

Мне пришлось использовать форму множественного числа id во всех полях выбора формы, таких как:

series_ids, curator_ids.

Поэтому моя последняя строка сценария:

<%= f.select(:curator_ids, Curator.order('name asc').map{|s| [s.name, s.id]}, {:include_blank => true}, {:class => 'select-field-style'})  %>
0 голосов
/ 05 декабря 2018

Вы можете указать класс и пустую строку для выбора, например,

<%= f.select(:series, Series.order('word asc').map{|s| [s.word, s.id]}, {:include_blank => true}, {:class => 'select-field-style'})  %>
...