2011-08-28 23 views
8

? Estoy tratando de crear una funcionalidad de "etiqueta" que permita al usuario "etiquetar" elementos en los que están interesados. Aquí está mi modeloRails 3 - ¿Cómo se crea un nuevo registro desde link_to

class tag 
    belongs_to :user 
    belongs_to :item 
end 

La tabla de base de datos correspondiente tiene las necesarias :user_id y :item_id campos.

En la lista de :items quiero un enlace al lado de cada :item que permita al usuario etiquetar el :item. Como conozco el :user_id y el :item_id, quiero crear un nuevo registro :tag, establecer los campos de id y guardar el registro, todo sin la intervención del usuario. He intentado lo siguiente llamada a link_to, pero ningún registro se guarda en la base de datos:

<%= link_to 'Tag it!', {:controller => "tracks", 
         :method => :post, 
         :action => "create"}, 
         :user_id => current_user.id, 
         :item_id => item.id %> 

(Este código está dentro de un:. @item.each do |item| declaración, por lo que es válido item.id)

crea este link_to llamada esta URL:

http://localhost:3000/tags?method=post&tag_id=7&user_id=1 

que no crea un registro en la base de datos Tag. Aquí está mi acción :create en el tags_controller

def create 
    @tag = Tag.new 
    @tag.user_id = params[:user_id] 
    @tag.tag_id = params[:tag_id] 
    @tag.save 
    end 

¿Cómo puedo obtener link_to para crear y guardar un nuevo registro de la etiqueta?

Respuesta

14

El hecho mismo de que la URL generada tenga el método como parámetro implica que está haciendo un GET y no POST.

firma El link_to debe utilizar es link_to(body, url_options = {}, html_options = {})

<%= link_to 'Tag it!', {:controller => "item", 
         :action => "create", 
         :user_id => current_user.id, 
         :item_id => item.id}, 
         :method => "post" %> 

: método debe ser pasado a html_options y descanso a url_options. Esto debería funcionar.

+0

Gracias! Funciona muy bien con tu solución. Mostrar la firma link_to en tu respuesta realmente me ayudó a entender finalmente qué estaba pasando. Muy apreciado. –

+1

Solo un comentario rápido. En el valor hash url_options, el valor de la clave del controlador debe ser "elementos", no "elemento". Le daría un error de enrutamiento ActionController al tratar de mostrar el enlace. – icantbecool

+0

@dexter, ¿qué sucede si el enlace está fuera de la aplicación, como en un correo electrónico, por ejemplo? Mi caso de uso es para confirmaciones de asistencia. Quiero crear un nuevo RSVP directamente desde el enlace de correo electrónico, pero quiero permanecer RESTful. – Mohamad

Cuestiones relacionadas