2012-05-02 20 views
5

en un controlador que tengo una acción de crearrieles pasar parámetro adicional a un modelo

def create 

    params[:note] 
    @note = current_user.notes.new(params[:note]) 

     if @note.save 
     respond_with @note, status: :created 
     else 
     respond_with @note.errors, status: :unprocessable_entity 
     end 
    end 

quiero pasar al modelo de otro parámetro llamado current_user, cómo hacerlo y cómo retrive el parámetro pasado en una método modelo?

+0

¿a qué modelo y hacer ¿Quieres pasar ese param? – MrDanA

Respuesta

3
@note = Note.new(params[:note].merge(:user_id => current_user.id)) 

Pero quizás esta no es la mejor manera de cómo lo hace, mira esto: Adding variable to params in rails

Si desea acceder a current_user en el modelo, consulte: Rails 3 devise, current_user is not accessible in a Model ?

+1

No necesita 'fusionar' cuando puede asignar directamente: 'params [: note] [: user_id] = current_user.id' Recuerde que' merge' devuelve una copia, por lo que esto no altera los parámetros, pero en su lugar, devuelve una versión con entradas adicionales. – tadman

+0

Gracias por la aclaración. Cuando escribí la respuesta, quise utilizar 'merge' mientras llamaba' new'. es decir: 'Note.new (params [: note] .merge (: user_id => current_user.id))' ¿Sería correcto? –

+0

Eso tiene sentido ya que usa el resultado. 'merge' en un contexto vacío casi siempre es inútil. – tadman

1

Normalmente lo haces con un hidden_field.

Por lo tanto, en su vista de creación, agregaría current_user como un campo oculto.

<%= form_for @note do |f| %> 
    # all your real fields 
    <%= f.hidden_field :current_user current_user %> 
<% end %> 

Luego, en la creación de parametros del controlador [: nota] [: CURRENT_USER] se definiría, y se añade a su modelo, asumiendo que su modelo tiene un atributo llamado 'current_user'

+5

Si bien agregar campos ocultos personalizados puede ser útil, no lo haría para current_user. Es demasiado fácil para un usuario malintencionado cambiar el contenido del formulario antes de enviarlo. Ahora tienes un registro en tu mesa que dice que Bob hizo algo, cuando en realidad era Alice ... Muévelo al controlador como lo sugirió Mikhail. – Unixmonkey

Cuestiones relacionadas