2011-08-01 15 views
7

me han preguntado sobre los puestos de usuario (recursos anidados, obviamente) y tiene una larga lista de mensajes de diferentes usuarios. Me gustaría que el usuario pueda hacer clic en una pequeña estrella al lado de cada publicación para preferir esa publicación en particular a través de ajax. ¿Alguna sugerencia sobre cómo lograr esto? El problema al que me estoy enfrentando es tener varios botones favoritos en una página, lo que favorece múltiples publicaciones.botón rieles ajax favorito para los puestos de usuario

Esto es sorta como Gmail hace con correos electrónicos favoritos en su bandeja de entrada. En realidad, es exactamente así.

Respuesta

10

Primero necesitas configurar la base de datos para manejar esto, personalmente iría con una asociación has_many: through porque proporciona más flexibilidad sobre has_and_belongs_to_many. La elección, sin embargo, depende de usted. Te recomiendo que busques los diferentes tipos en la API y lo decidas por ti mismo. Este ejemplo tratará con has_many: through.

Modelos

# user.rb (model) 
has_many :favorites 
has_many :posts, :through => :favorites 

# post.rb (model) 
has_many :favorites 
has_many :users, :through => :favorites 

# favorite.rb (model) 
belongs_to :user 
belongs_to :post 

Controlador

# favorites_controller.rb 
def create 
    current_user.favorites.create(:post_id => params[:post_id]) 
    render :layout => false 
end 

Rutas

match "favorites/:post_id" => "favorites#create", :as => :favorite 

jQuery

$(".favorite").click(function() { 
    var post_id = $(this).attr('id'); 
    $.ajax({ 
    type: "POST", 
    url: 'favorites/' + post_id, 
    success: function() { 
     // change image or something 
    } 
    }) 
}) 

Notas

Esto supone un par de cosas: Utilización de los carriles 3, utilizando jQuery, cada icono favorito tiene un id html con el ID del anuncio. Tenga en cuenta que no he probado el código y lo escribí en esta ventana, por lo que probablemente tenga que solucionar algunos problemas menores, pero debería darle una impresión de cómo I generalmente lo hace. Lo visual y tal lo dejo a usted.

Si alguien detectar cualquier error no dude en modificar este post.

1

Haz un form_tag para cada botón favorito con :remote => true. Agregue los ID de la publicación y el usuario actualmente conectado como campos ocultos para cada uno de los formularios.

Para actualizar el estado favorita, puede escribir una vista RJS, que contendrá el jQuery para actualizar el favorito para "post ha sido favorito".

Algo como esto:

- for post in @posts 
    = form_tag toggle_favorite_post_path, :remote => true 
    = hidden_field_tag :post_id, post.id 
    = hidden_field_tag :user_id, current_user.id 
    - if Favorite.where(:post_id => post.id, :user_id => current_user.id).exists? # TODO: move this to model 
     = submit_tag "Add to favorites", :class => "favorite-post-button" 
    - else 
     = submit_tag "Remove from favorites", :class => "unfavorite-post-button" 

Puede personalizar el aspecto del botón (s) presentará al ser una imagen de una estrella con CSS.

Si desea proporcionar una opción para seleccionar varios mensajes y luego favorita todos a la vez, usted tiene que escribir JavaScript personalizado para manejar eso. En el controlador de clics para el botón "favorito seleccionado", dentro de ese controlador, recopile todos los identificadores de correos que se han seleccionado, serialice los identificadores en una cadena y envíelos al controlador.

Cuestiones relacionadas