2011-01-25 13 views
6

Estoy tratando de implementar la "Amistad" en mi aplicación Rails 3 como se describe en Railscast 163:Self Referential AssosicationRails 3: ": method =>: post" no funciona ... parece ser 'GET' cuando debería 'POST'

Tengo todo configurado como se describe. Estoy usando un modelo de usuario básico que inicia sesión con Authlogic que funciona bien. Sin embargo, cuando intento agregar un amigo usando el siguiente enlace:

<% for user in @users %> 
<%=h user.username %> 
    <%= link_to "Add Friend", friendships_path(:friend_id => user), :method => :post %>  
<% end %> 

me sale una redirección a http://localhost:3000/friendships?friend_id=2 y una acción Desconocido 'índice' La acción no se pudo encontrar para FriendshipsController error sin más explicaciones. Esto es especialmente extraño ya que tengo una redirección codificada de nuevo al método "User # show" para mi usuario actual (es decir, volver a dirigir al perfil después de agregar un amigo).

Si ayuda, aquí está mi "amistades # crea" método:

def create 
    @friendship = current_user.friendships.build(:friend_id => params[:friend_id]) 
    if @friendship.save 
    flash[:notice] = "Added friend." 
    redirect_to :controller => 'users', :action => 'show', :id =>'current_user' 
    else 
    flash[:notice] = "Unable to add friend." 
    redirect_to :controller => 'users', :action => 'show', :id =>'current_user' 
    end 
end 

Alguna idea de qué podría estar causando esto? Encontré a alguien que tiene un problema similar aquí pero no pude encontrar una solución definitiva: Rails 3 and Friendship Models

Gracias de antemano por su ayuda!

~ Dan

+0

¿Se puede publicar el código HTML que el enlace anterior_para generar (es decir, ver-fuente de la salida web)? –

+0

https://gist.github.com/796758 Aquí hay una fuente completa de la salida generada. – thoughtpunch

+0

¿El archivo auxiliar 'rails.js' (que realmente implementa': method =>: post') está referenciado desde su HTML? – yfeldblum

Respuesta

10

creo que link_to poner los argumentos en la cadena de consulta, ya que está creando con enlace HTML, incluso si se pone: method =>: post si js está desactivado.

puede simular una publicación con evento javascript: onclik.

aniway, use un link_to con método: publicar es en general una mala idea. en rieles puede usar button_to ayuda para este propósito y póngalo como un enlace.

edición:
En Rails3 doc Parece que link_to tiene que simular la misma behaviur de button_to Cuando se llama con params: method =>: Enviar

(crear dinámicamente un formulario HTML y enviar inmediatamente el formulario)

pero no es cierto para mí en Rails 3.0.3 incluso si javascript está habilitado. Voy a investigar.

de todos modos debe usar botones y formularios para cualquier cosa que no sea un GET; hipervínculos intencionadamente no permiten métodos que no sean GET

Edit2: bien, rails3 no crean un formulario en línea para simular la solicitud de entrada a través del enlace. en Rails3 se agrega un atributo de método de datos = publicación a la etiqueta para manipularlo mediante la función javascript. De esta forma, la solicitud se degrada con gracia en una llamada a get si js está deshabilitado.

+0

¡Esto funciona genial! ¿Alguna idea de por qué el método link_to funciona de forma diferente que el button_to desde un punto de vista de programación? ¿Qué está sucediendo exactamente detrás de escena? – thoughtpunch

4

Es una respuesta tardía, pero es una solución a este problema (al menos a mí me funciona):

<%= link_to "Add Friend", {:controller => :friendships, :action => :create, :friend_id => user_id }, :method => :post %>  

Sé que es desde hace mucho tiempo para su problema, pero puede ayudar a alguien :)