Rails 5 и Chosen multi-select: реализация его как вложенной формы для отношения многие-многие с использованием таблицы соединений - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь реализовать выбранный мультиселектный ввод в приложении Rails 5.У меня есть отношение has_many_and_belongs_to_many между моделью Film и моделью Actor с помощью модели соединения Cast.

class Film < ApplicationRecord

  has_one_attached :avatar

  has_many :casts
  has_many :actors, through: :casts

  accepts_nested_attributes_for :casts


end

и

class Actor < ApplicationRecord

  has_many :casts
  has_many :films, through: :casts

  accepts_nested_attributes_for :films

end

Моя форма

<%= simple_form_for @film do |f| %>

    <%= f.input :title %>
    <%= f.input :synopsis %>
    <%= f.simple_fields_for(:casts) do |m| %>
      <%= m.collection_select :actor_id, Actor.all , :id, :name, { include_blank: true}, { class: 'chosen-select', :multiple => true, :data => { :placeholder => ' ' }} %>
    <% end %>

    </br>
    <div class="form-actions">
      <%= f.file_field :avatar, :style => "padding:10px 0px" %>
    </div>
    </br>
    <div class="form-actions">
      <%= f.button :submit, :class => "btn-primary" %>
    </div>

<% end %>
</br>

Вот мой контроллер фильмов

 def new
    @film = Film.new
    @film.casts.build
  end

  # POST /films
  # POST /films.json
  def create
    @film = Film.new(film_params)
    respond_to do |format|
      if @film.save
        format.html { redirect_to @film, notice: 'Film was successfully created.' }
        format.json { render :show, status: :created, location: @film }
      else
        format.html { render :new }
        format.json { render json: @film.errors, status: :unprocessable_entity }
      end
    end
  end


 def film_params
      params.require(:film).permit(:title, :synopsis, :avatar, casts_attributes: [:film_id, :actor_id])
    end

Если я установил мультиселект ": множественный => ложь ", он работает и сохраняет запись в таблице соединений.Но я не могу заставить его работать с множественным выбором.Он будет публиковать массив идентификаторов актеров, но потерпит неудачу со следующими

Started POST "/films" for 127.0.0.1 at 2018-12-29 17:11:47 +0000
Processing by FilmsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"HQyOBebjBuAFHT8TlRi7LbmQiMtmeQsc0qLip55ihrOygIsMH1p0HBOngb40y3ywNYRWDOyRWDEpwr6vGZjNJQ==", "film"=>{"title"=>"Top Gun", "synopsis"=>"Planes", "casts_attributes"=>{"0"=>{"actor_id"=>["", "13", "104"]}}}, "commit"=>"Create Film"}
  Member Load (0.2ms)  SELECT  "members".* FROM "members" WHERE "members"."id" = ? ORDER BY "members"."id" ASC LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ /Users/simonalice/.rvm/gems/ruby-2.6.0/gems/activerecord-5.2.2/lib/active_record/log_subscriber.rb:98
Unpermitted parameter: :actor_id
   (0.0ms)  begin transaction
  ↳ app/controllers/films_controller.rb:32
   (0.0ms)  rollback transaction

. Для этого типа проблемы вполне достаточно использовать один выбор или использовать несколько флажков, но не использовать выбранный гем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...