Сильные параметры для различных методов контроллера - PullRequest
0 голосов
/ 17 ноября 2018

Я создаю контроллер в Rails и ищу способы иметь разные сильные параметры для разных методов контроллера

При обновлении и новых действиях я хотел бы потребовать post

params.require(:post).permit(:body, :is_public, :title, :id)

Но в post/index мне не нужны эти параметры.

Как сделать разные требования сильными параметрами для разных методов контроллера?

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Ваши "методы сильных параметров" - это просто методы Ruby.Вы можете иметь сколько угодно.

class PostsController < ApplicationController

  def create
    @post = Post.new(post_params)
  end

  def update
    @post = Post.find(params[:id])
    if @post.update(update_params)
      # ...
    else 
      # ...
    end
  end

  private

  def base_params
    params.require(:post)
  end

  # Don't take IDs from the user for assignment!
  def update_params
    base_params.permit(:body, :title)
  end

  def create_params
    base_params.permit(:body, :title, :foo, :bar)
  end
end

Вы также можете назвать их как хотите.Называть его [resource_name]_params - это просто условное обозначение.

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

В 99,9% случаев вы будете обрабатывать только параметры с сильными параметрами в обновлении и создавать действия, соответствующие POST и PUT /PATCH.Это действия, которые берут хэши параметров у пользователя и передают их моделям.Именно здесь есть потенциальная уязвимость массового назначения, если вы не будете осторожны с внесением в белый список разрешенных параметров.

Действие show, edit и destroy обычно принимает только один параметр в форме идентификатора.new редко принимает какие-либо параметры, а index принимает параметры, только если вы строите какой-либо поиск или фильтрацию.

show, edit, new и index являются маршрутами GET, поэтомуони должны быть идемпотентными и не изменять и не создавать ресурсы.

Ни один из них не имеет реального потенциала для уязвимостей массового назначения, если вы действительно не испортили все полностью.

0 голосов
/ 17 ноября 2018

Просто сделайте что-то вроде

class FooController < ApplicationController


  def create
    @post = Post.new(create_params)
    if @post.save
      blah
    else
      blah
    end
  end

  def index
    ... something else
  end

private

  def create_params 
    params.require(:post).permit(:body, :is_public, :title, :id)
  end

end
...