【问题标题】:Rails 3: rails newbie confused about routes/controllersRails 3:rails 新手对路由/控制器感到困惑
【发布时间】:2011-10-09 20:08:15
【问题描述】:

我创建了一个小型 twitter 克隆应用程序,用户可以在其中发布帖子、关注其他用户,并获得他们关注的用户的所有帖子的提要。我为帖子添加了一个类别选择,“惊悚片”“西部片”“恐怖片”等等。

当用户登录时,根网址是他们的仪表板。

routes.rb

root :to => "pages#home"

pages#home 是用户提要所在的位置:@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

现在我已经弄清楚如何解析提要并提取一个子提要,其中仅包含 category_id 为“2”(也称为“惊悚片”)的帖子

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

当登录用户访问 root_path 时,他们会看到他们的仪表板和整个提要。我希望有一个链接,上面写着“惊悚片”,它将把当前的整个@feed_items 更改为@thriller_feed_items,但我对路线和视图的工作方式感到困惑。 Twitter 使用 /!#/mentions 作为子集提要的地址,我需要做同样的事情吗?我该如何设置?

编辑:展示我的提要方法的工作原理。

用户模型

  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

【问题讨论】:

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


    【解决方案1】:

    我现在假设这个控制器是非 RESTful 的。

    编辑:我已对此进行了更新,也允许使用类别名称。相应地调整路线和变量索引。

    Routes.rb

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

    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" %>
    

    【讨论】:

    • 嗨,我真的很喜欢这个解决方案,但我如何才能获得“/category/thriller”的路线?再次感谢
    【解决方案2】:

    那么为什么不使用 Pages 控制器创建一个新的控制器动作,称为惊悚片,以及一个新的视图,称为 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

    【讨论】:

    • +1 推荐阅读。除了了解一些基础知识的工作原理之外,了解如何嵌套资源并利用rake routes 来发挥自己的优势将使生活更轻松。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2017-07-31
    • 2014-07-08
    • 2017-02-28
    相关资源
    最近更新 更多