Cómo eliminar un campo de los parámetros [: algo]

116

Mi formulario de registro, que es un formulario para el modelo de Usuarios, toma un valor de cadena para la empresa. Sin embargo, acabo de hacer un cambio para que los usuarios pertenezcan a empresas. Por lo tanto, necesito pasar un objeto de Empresa al modelo de Usuarios.

Quiero usar el valor de cadena del formulario para obtener el objeto de Company:

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

Creo que lo anterior funciona, sin embargo, el formulario está pasando: empresa (que es una cadena) al modelo cuando llamo:

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

Por lo tanto, quiero saber (y no puedo encontrar cómo) eliminar el parámetro: company antes de pasarlo al modelo de usuario.

providencia
fuente

Respuestas:

209

Rails 4/5 - respuesta editada (ver comentarios)

Desde que se escribió esta pregunta, ¡las versiones más recientes de Rails han agregado el extracto! y excepto, por ejemplo:

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

Esta es una forma más segura de 'capturar' todos los parámetros que necesita en una copia SIN destruir el original pasado en los parámetros (lo cual NO es algo bueno, ya que hará que la depuración y el mantenimiento de su código sean muy difíciles con el tiempo).

O simplemente puede pasar directamente sin copiar, por ejemplo:

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

El extract!(tiene el operador! Bang) modificará el original, así que úselo con más cuidado.

Respuesta original

Puede eliminar un par clave / valor de un Hash usando Hash#delete:

params.delete :company

Si está contenido en params [: user], entonces usaría esto:

params[:user].delete :company
Jeremy Ruten
fuente
16
Estoy usando Rails 4.0 y model_params.delete :key_nameno funciona, ¿alguna idea de por qué?
Zorayr
13
eliminar del hash de params es una MALA IDEA. confunde fácilmente a las personas durante la depuración, etc. Utilice un hash personalizado que pase para asignar atributos, por ejemplo, use assin_params = params.dup.delete(:company). nunca elimine de los parámetros directamente
Dominik Goltermann
4
quise decirassign_params = params.dup; assign_params.delete(:company)
Dominik Goltermann
12
@Zorayr Tuve el mismo problema. Para mí fue porque my model_paramsera una función, que sacó los parámetros relevantes de params. Así que cuando se deletede model_paramsque estás realmente sólo la supresión a partir del hash que model_paramsregresa.
Lucy Bain
1
user_params es un método, así que cuando haces user_params.delete (: this_param), calcula el hash correcto, pero cualquier llamada posterior a user_params volverá a calcular el hash desde cero. Por eso @Gaul dijo que es una mala idea. En Rails 5 ahora tiene el método params.except y también extraer!
rmcsharry
89

Probablemente deberías usar hash, excepto

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

Logra 2 cosas: le permite excluir más de 1 clave a la vez y no modifica el hash original.

samuraisam
fuente
Rails 4 ActionController :: Los parámetros heredaron Hash, así que ¡excepto o extraer! funcionaría, en Rails 5, tiene excepto y extraer! métodos definidos en ActionController :: Parámetros en sí
kangkyu
De hecho, tengo estos parámetros hash en el método UPDATE. ¿Cómo puedo exceptuar a los que tienen "-1"como clave? {"utf8" => "✓", "_method" => "parche", "autenticity_token" => "VtY ...", "folleto" => {"title" => "Hola mundo", "profilings_attributes" => {"-1" => {"member_profile_id" => "3"}, "0" => {"porcentaje" => "10.0", "descripción" => "¡Alguna descripción!", "_Destroy" = > "false", "id" => "10"}, "1" => {...}}, "sponsorings_attributes" => {"-1" => {"sponsor_id" => "2"}, "0" => {"folleto_id" => "
2

La forma correcta de lograr esto es usando 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

De esta manera, tiene más control sobre qué parámetros deben pasarse al modelo

Deepak Mahakale
fuente
1
respond_to do |format|
  if params[:company].present?
    format.html { redirect_to(:controller => :shopping, :action => :index) }
  else
    format.html
  end
end

esto eliminará los parámetros de la URL

Taimoor Changaiz
fuente
0

Para que sea posible eliminarlo, puede hacer una nota :

def parameters
  @parameters ||= params.require(:root).permit(:foo, :bar)
end

Ahora puedes hacer:

parameteres.delete(:bar)
parameters
=> <ActionController::Parameters {"foo" => "foo"} permitted: true>
Washington Botelho
fuente