Rails 3:rails newbie对路由/控制器感到困惑

时间:2011-10-09 20:08:16

标签: ruby-on-rails ruby-on-rails-3 model-view-controller routes

我创建了一个小型的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

2 个答案:

答案 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