Недопустимый параметр Rails - PullRequest
0 голосов
/ 06 мая 2020

У меня есть форма, в которой есть несколько готовых тегов, которые пользователь может выбрать в сообщении. Эти теги установлены с отношением has_many through:. Кажется, все работает, но когда я сохраняю (сообщение сохраняет), появляется Unpermitted parameter: :tags из метода сохранения контроллера.

Модель тега:

class Tag < ApplicationRecord
  has_many :post_tags
  has_many :posts, through: :post_tags
end

Модель PostTag:

class PostTag < ApplicationRecord
  belongs_to :tag
  belongs_to :post
end

Модель поста:

class Post < ApplicationRecord
    ...
    has_many :post_tags
    has_many :tags, through: :post_tags

Методы пост-контроллера:

  def update
      # saves tags
      save_tags(@post, params[:post][:tags])

      # updates params (not sure if this is required but I thought that updating the tags might be causing problems for the save.
      params[:post][:tags] = @post.tags
      if @post.update(post_params)
        ... 
    end
  end

...

private 
  def post_params
    params.require(:post).permit(:name, :notes, tags: [])
  end

  def save_tags(post, tags)
    tags.each do |tag|
       # tag.to_i, is because the form loads tags as just the tag id.
       post.post_tags.build(tag: Tag.find_by(id: tag.to_i))
    end
  end

Просмотр (теги - это флажки, отображаемые как кнопки):

  <%= form.label :tags %>
    <div class="box">
    <% @tags.each do |tag| %>
      <div class="check-btn">
        <label>
          <%=  check_box_tag('dinner[tags][]', tag.id) %><span> <%= tag.name %></span>
      </label>
      </div>
      <% end %>
    </div>

Опять же, это сохраняет и работает нормально, но я бы хотел избавиться от Unpermitted parameter, которое выдается в консоли.

1 Ответ

3 голосов
/ 06 мая 2020

Все ваше решение является творческим, но чрезвычайно избыточным. Вместо этого используйте помощники по сбору:

<%= form_with(model: @post) |f| %> 
  <%= f.collection_check_boxes :tag_ids, Tag.all, :id, :name %>
<% end %>

tags_ids= - специальный установщик, созданный has_many :tags, through: :post_tags (они создаются для всех ассоциаций has_many и HABTM). Он принимает массив идентификаторов и автоматически создает / удаляет строки соединения для вас.

Все, что вам нужно сделать в вашем контроллере, это белый список post[tag_ids] в виде массива:

class PostsController < ApplicationController
  # ...

  def create
    @post = Post.new(post_params)
    if @post.save 
      redirect_to @post 
    else
      render :new
    end
  end

  def update
    if @post.update(post_params)
      redirect_to @post 
    else
      render :edit
    end
  end

  private 
  # ...

  def post_params
    params.require(:post)
          .permit(:name, :notes, tag_ids: [])
  end
end
...