El método del modelo Ruby on Rails 'nuevo' no acepta parámetros adicionales

ACTUALIZACIÓN

Respondí mi pregunta a continuación, pero todavía estoy pidiendo una forma más bonita de lograr mi objetivo. Tengo la sensación de que mi controlador sabe demasiado sobre como hacer las cosas.


Tengo una acción de creación en mi VideoController:

def create
  method = 'get_' + params[:video][:provider] + '_video_id'
  provider_video_id = Video.send(method, params[:video][:url])
  thumb = Video.get_thumb_from_youtube(provider_video_id)

  @video = Video.new(params[:video], :provider_video_id => provider_video_id, :thumb => thumb, :views => 0, :likes => 0)
  if @video.save!
    redirect_to video_path('1'), notice:'Video added successfully.'
  else
    render :new
  end
end

Llamo a Video.new con params[:video] obtener su información de un formulario que completa el usuario. Luego manipulo la URL que el usuario pasó con el formulario para recuperar el video_provider_idythumb.

Sin embargo, Rails no está guardando el video con provider_video_idy thumb... Recibo este error al guardar:

Validation failed: Thumb can't be blank, Thumb is invalid, Provider video can't be blank

Mi conjetura es la newEl método no acepta parámetros adicionales...

preguntado el 30 de junio de 12 a las 16:06

4 Respuestas

¿Qué tal una devolución de llamada antes de guardar en su modelo? Este es un ejemplo de valor predeterminado fuera de lo común, pero también podría pasar parámetros.

after_initialize :url


private
def url
  self.provider_video_id ||= "default value"
end

Respondido el 30 de junio de 12 a las 17:06

Su solución parece buena, pero no estoy seguro de entenderla bien. Necesito llamar a un método para obtener provider_video_id, así que podría escribir: self.provider_video_id = get_provider_video_id(params[:video][:url]? - Justin d.

Es posible que desee utilizar .merge():

En lugar de

method = 'get_' + params[:video][:provider] + '_video_id'
params[:video][:provider_video_id] = Video.send(method, params[:video][:url])
params[:video][:thumb] = Video.get_thumb_from_youtube(params[:video][:provider_video_id])
params[:video][:views] = params[:video][:likes] = 0    

@video = Video.new(params[:video])

Puedes hacer (modificando el código de la pregunta original):

@video = Video.new(params[:video].merge(:provider_video_id => provider_video_id, :thumb => thumb, :views => 0, :likes => 0))

Eso fusionará los parámetros en un solo hash.

Respondido 01 Jul 12, 00:07

Pero si lo desea, siempre puede anular la nueva acción predeterminada con algo como

class Video 

   def new(attr1, attr2)
     super
     #do something with attr2
   end

end

Respondido 17 ago 18, 01:08

Buena solución, pero no es exactamente lo que estoy buscando. ¡Muchas gracias! - Justin d.

Resolví el problema. Creo que Ruby on Rails' newmétodo no acepta más de un parámetro, que por lo general es params. Lo que hice fue lo siguiente:

method = 'get_' + params[:video][:provider] + '_video_id'
params[:video][:provider_video_id] = Video.send(method, params[:video][:url])
params[:video][:thumb] = Video.get_thumb_from_youtube(params[:video][:provider_video_id])
params[:video][:views] = params[:video][:likes] = 0    

@video = Video.new(params[:video])

Ahora, parece funcionar.

Respondido el 30 de junio de 12 a las 16:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.