1

J'ai créé une petite application clone twitter où les utilisateurs font des messages, suivent d'autres utilisateurs, et ont un flux de tous les messages par l'utilisateur qu'ils suivent. J'ai ajouté un choix de catégories pour les messages à tomber, "thriller" "western" "horreur" et ainsi de suite.Rails 3: rails newbie confus au sujet des routes/contrôleurs

Lorsqu'un utilisateur est connecté, l'adresse Web racine est son tableau de bord.

routes.rb 

root :to => "pages#home" 

et pages # accueil est l'endroit où l'alimentation de l'utilisateur se trouve: @feed_items = current_user.feed

PagesController 

def home 
    @title = "Home" 
    @featured_posts = Post.featured.limit(10) 
    if user_signed_in? 
     @user = current_user 
     @post = current_user.posts.build 
     @feed_items = current_user.feed.paginate(:per_page => "10", :page => params[:page]) 
    end 
end 

Maintenant, j'ai compris comment analyser le flux et extraire un sous-ensemble d'alimentation qui contient seulement les messages avec category_id « 2 » (aussi connue comme « thriller »)

@thriller_feed_items= current_user.feed.where(:category_id => '2') 

Lorsqu'un utilisateur connecté va au root_path ils voient leur tableau de bord et l'alimentation entier. Je voudrais qu'il y ait un lien qui dit «thrillers» qui va changer les @feed_items actuels dans les @thriller_feed_items mais je suis confus sur la façon dont les routes et les vues fonctionneraient. Twitter utilise /! #/Mentions comme adresse pour les flux de sous-ensembles, dois-je faire la même chose? Comment pourrais-je mettre cela en place?

EDIT: pour montrer comment fonctionne ma méthode d'alimentation.

modèle utilisateur

def feed 
    Post.from_users_followed_by(self) 
    end 

modèle post

def self.followed_by(user) 
     followed_ids = %(SELECT followed_id FROM relationships 
         WHERE follower_id = :user_id) 
     where("user_id IN (#{followed_ids}) OR user_id = :user_id", :user_id => user) 
    end 

Répondre

2

Je suppose à ce stade que ce contrôleur est non-RESTful.

Modifier: J'ai mis à jour ceci pour autoriser également un nom de catégorie. Ajustez les itinéraires et les indices variables en conséquence.

Routes.rb

match "/category/:category" => "pages#home" 

Pages # Accueil

def home 
    @title = "Home" 
    @featured_posts = Post.featured.limit(10) 
    if user_signed_in? 
    @user = current_user 
    @post = current_user.posts.build 
    # BEGIN NEW 
    if params[:category] 
     # is :category an integer id? 
     if params[:category].to_i.to_s == params[:category] 
     @feed_items= current_user.feed.where(:category_id => params[:category]) 
     else 
     # assuming Category has_many :feeds 
     @feed_items= current_user.feed.includes(:category).where(
      ['`categories`.name = ?', params[:category]] 
     ) 
     end 
    else 
     @feed_items = current_user.feed 
    end 
    @feed_items = @feed_items.paginate(:per_page => "10", :page => params[:page]) 
    # END NEW 
    end 
end 

Vue:

<%= link_to "Thriller Feed Items (by id)", "/category/2" %> 
<%= link_to "Thriller Feed Items (by name)", "/category/Thriller" %> 
+0

Salut, j'adore vraiment cette solution, mais comment est-ce que j'obtiendrais la route "/ category/thriller" ??? Merci encore –

1

alors pourquoi ne pas vous utiliser votre contrôleur Pages pour créer une nouvelle action de contrôleur appelé thriller, et une nouvelle vue appelée pages/thriller.html. erb.

Dans votre routes.rb, vous pouvez faire quelque chose comme:

get 'page/thriller' 

ou

match 'thriller' => 'page#thriller' 

Plus généralement, vous pouvez créer une action de genre et de passer le genre comme une carte d'identité.

comme

match 'genre/:genre_id' => 'page#genre' (you get the parameter with params[:genre_id]) 

Lisez également les routing guide.

+0

+1 pour la lecture recommandée. En plus de comprendre comment certaines des bases fonctionnent, savoir comment imbriquer les ressources et utiliser les «rake routes» à votre avantage vous facilitera la vie. – Tass