我创建了一个小型的Twitter克隆应用程序,用户可以在其中发帖,关注其他用户,并通过他们关注的用户提供所有帖子的摘要。我为帖子添加了一些类别选择,“惊悚片”,“西部片段”,“恐怖片”等等。
当用户登录时,根网址是其信息中心。
routes.rb
root :to => "pages#home"
页面#home是用户Feed的位置:@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
现在我已经想出如何解析Feed并提取一个仅包含category_id'2'的帖子的子集Feed(也称为'惊悚片')
@thriller_feed_items= current_user.feed.where(:category_id => '2')
当登录用户转到root_path时,他们会看到他们的信息中心和整个Feed。我希望有一个链接说“惊悚片”,它会将当前整个@feed_items改为@thriller_feed_items,但我对路线和视图的工作原理感到困惑。 Twitter使用/!#/ mentions作为子集Feed的地址,我是否需要做同样的事情?我该如何设置?
编辑:显示我的Feed方法的工作原理。
用户模型
def feed
Post.from_users_followed_by(self)
end
发布模型
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
答案 0 :(得分:2)
我现在假设这个控制器是非RESTful的。
编辑:我已将此更新为允许类别名称。相应地调整路线和变量指数。
<强>的routes.rb 强>
match "/category/:category" => "pages#home"
信息页#家强>
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
查看:强>
<%= link_to "Thriller Feed Items (by id)", "/category/2" %>
<%= link_to "Thriller Feed Items (by name)", "/category/Thriller" %>
答案 1 :(得分:1)
那么为什么不使用Pages控制器来创建一个名为thriller的新控制器操作,以及一个名为pages / thriller.html.erb的新视图。
在您的routes.rb中,您可以执行以下操作:
get 'page/thriller'
或
match 'thriller' => 'page#thriller'
更一般地说,您可以创建一个流派动作并将该流派作为ID传递。
像
match 'genre/:genre_id' => 'page#genre' (you get the parameter with params[:genre_id])
另请阅读routing guide。