Как удалить поле из params [: что-то] - PullRequest
104 голосов
/ 01 марта 2011

Моя регистрационная форма, которая является формой для модели Users, принимает строковое значение для компании. Однако я только что внес изменение, так что пользователи принадлежат компаниям. Поэтому мне нужно передать объект Company в модель Users.

Я хочу использовать строковое значение из формы для получения объекта Company:

@user.company = Company.find_by_name(params[:company])

Я полагаю, что вышесказанное работает, но форма передает: company (которая является строкой) в модель, когда я звоню:

@user = User.new(params[:user])

Поэтому я хочу знать (и не могу найти, как) удалить параметр: company перед передачей его модели User.

Ответы [ 4 ]

191 голосов
/ 01 марта 2011

Rails 4/5 - отредактированный ответ (см. комментарии)

Поскольку этот вопрос был написан, более новые версии Rails добавили extract! и кроме например:

new_params = params.except[the one I wish to remove]

Это более безопасный способ «собрать» все нужные вам параметры в копию, БЕЗ уничтожения оригинала, переданного в параметрах (что НЕ очень хорошо, так как со временем отладка и обслуживание вашего кода будут очень сложными). ).

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

@person.update(params[:person].except(:admin))

extract! (имеет оператор! Bang) изменит оригинал, поэтому используйте его с большей осторожностью!

Оригинальный ответ

Вы можете удалить пару ключ / значение из хэша, используя Hash#delete:

params.delete :company

Если он содержится в params [: user], вы должны использовать это:

params[:user].delete :company
87 голосов
/ 21 октября 2014

Возможно, вы должны использовать hash.except

class MyController < ApplicationController
  def explore_session_params
    params[:explore_session].except(:account_id, :creator)
  end
end

Он выполняет 2 вещи: позволяет исключать более 1 ключа за раз и не изменяет исходный хеш.

1 голос
/ 20 сентября 2016

Правильный способ добиться этого - использовать strong_params

class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
  end

  private

  def user_params
    params.require(:user).permit(:name, :age)
  end
end

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

1 голос
/ 21 февраля 2012
respond_to do |format|
  if params[:company].present?
    format.html { redirect_to(:controller => :shopping, :action => :index) }
  else
    format.html
  end
end

это удалит параметры из URL

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