Rails: Что определяет название пройденных «params»? - PullRequest
0 голосов
/ 26 апреля 2019

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

То, что я прошел через учебные приложения, скажем, базовое приложение CRUD ... и позволяет вашему обычному пользователю создавать / редактировать / обновлять / удалять страницы.

Обычно вы видите что-то вроде:

params.require(:user).permit(:name, :email, :password, :password_confirmation)

То есть это означает, что переданные параметры params(:user) верно?

Однако иногда, например, при выполнении link_to и передаче чего-либо в запрос POST (например, патч или обновление или что-то подобное), параметр просто params[:id]. Что определяет, как будет называться params(:<name>)? 1016 *

Кажется, это зависит от форм ... но иногда нет? Это просто по умолчанию id иначе или что-то?

Ответы [ 3 ]

1 голос
/ 26 апреля 2019

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

Rails пытается предотвратить попадание злых, подлых людей в параметры и значения, к которым они не принадлежат.Мы можем сделать это, создав метод, который упаковывает наш объект params в указанную структуру:

params.require(:user).permit(:name, :email, :password, :password_confirmation)

Это означает, что params должен быть отправлен в следующем формате:

user: {
  name: "name",
  password: "password",
  password_confirmation: "password"
}

Если выпроверяя ваши логи в разработке, Rails будет отображать ваши параметры (если они будут отправлены) в каждом запросе.Если ваши параметры не в этом формате (с пользователем на корневом уровне), и вы используете метод user_params, он выдаст ошибку.user является обязательным .И если кто-то отправит параметры:

user: {
  name: "name",
  pseudonym: "sneaky param",
  password: "password",
  password_confirmation: "password"
}

Rails по-прежнему будет принимать name, password и password_confirmation, но отклонит pseudonym, поскольку это не разрешено вашим методом user_params.

В большом количестве кода вы увидите, что люди получают значение params[:id] напрямую.Это потому, что мы часто используем это только для чтения или уничтожения элемента.Методы *_params обычно зарезервированы для действий CREATE и UPDATE в контроллере, потому что именно здесь мы вводим параметры.

Это не является технически необходимым.Rails уже очищает пользовательский ввод в запросах Active Record.Таким образом, это не прямое требование для безопасного приложения.Вы можете извлечь параметры непосредственно из хеша параметров, а не использовать этот метод.Но это, безусловно, держит ваш код сухим.Это также гарантирует, что вы не предоставляете пользователю доступ к важным метаданным в вашей модели.Например, если вы ТАК, у вас (хотя и маловероятно) есть колонка upvote для моего поста.Если вы внесете белый список всех параметров и просто примете все параметры в методе Post.update(params), я мог бы отправить запрос POST с параметрами upvotes: 1,000,000.Я не думаю, что им это вообще понравится.

1 голос
/ 26 апреля 2019

Может быть определено по маршруту, по тегу ввода или вами.

По маршруту:

rails routes -g user 
   Prefix Verb   URI Pattern               Controller#Action
   signup GET    /signup(.:format)         users#new
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy

Здесь params[:id] устанавливается помощником url как edit_user_path(@user). Вы можете установить собственное имя параметра в config/routes.rb:

get 'profile/:user_id', to: 'users#show'
rails routes -g profile 
Prefix Verb URI Pattern                 Controller#Action
       GET  /profile/:user_id(.:format) users#show

По входу:

<%= form_for @user... do |f| %>
  <%= f.text_field :name
<% end %>

Здесь форма задает params: {user: {name: some_value}}, поскольку используемый в форме объект модели - User, а имя столбца - name.

А от вас:

link_to 'Profile', user_path(@user, locale: 'en')

который выводит: <a href=\"/users/1?locale=en\">Profile</a>

1 голос
/ 26 апреля 2019

Руководство по направляющим упоминает это

params является комбинацией:

  1. параметры маршрутизации
  2. GET-параметры (example.org/page?some_param=value)
  3. Параметры POST (данные формы, декодированный JSON и т. Д.)

params[:id] обычно исходит из параметров маршрутизации (/users/:id), могут быть другие параметры маршрута (например, другой распространенный случай - это вложенные маршруты, такие как /users/:user_id/some_other_resources/:id - будут :user_id и :id) и по соглашению сохраненный объект передается в params[:model_name]

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