2016-02-12 20 views
1

我正在使用Rails 5.0.0.beta2构建共享博客。我希望root路由为非特权用户解决users/:user_id/posts,这将显示所有用户帖子。随着事态的当前配置的路由被定义为:在Ruby on Rails中的根路由上设置参数

root to: 'posts#index'

它返回所有的职位(所有用户)。

我想:

root 'users/:user_id/posts' => 'posts#index', controller: 'posts', action: 'index'

导致:

root_path GET/posts#index {"users/:user_id/posts"=>"posts#index"}

rails/info/routes(或rails routes)。但似乎没有使用路线的:user_id组件 - 显示了所有发布的帖子。据我所知,没有路线应该这样做......(既检查路线表,也从手动输入路线)。

我也试过:

get 'users/:user_id/posts' => 'posts#index', :as => :root

导致: “耶,你on Rails的”

root_path GET /users/:user_id/posts(.:format) posts#index

但是供应的实际页面是页。

可以做到这一点吗?我会怎么做呢?

+0

你将不得不做一个重定向。但为什么不只是在索引页面上显示这些用户呢? –

+0

谢谢!不确定您的意思是“在这些用户的索引页面上显示”。 – dlu

+0

根据用户类型在页面上显示两个不同的东西。 –

回答

1

所有用户进行身份验证

所以你问的是如何书的“主页” @posts的那些current_user的。

有两种方法做到这一点(ControllerDevise):


控制器

#config/routes.rb 
root "posts#index" #-> url.com 

#app/controllers/posts_controller.rb 
class PostsController < ApplicationController 
    def index 
    @posts = user_signed_in? ? current_user.posts : Post.all 
    end 
end 

#app/views/posts/index.html.erb 
<% @posts.each do |post| %> 
    <%= post.title %> 
<% end %> 

这是把它关闭,最简单的方法。

路由无​​关紧要 - 如果您的用户已登录,则可以围绕其对象current_user范围限定数据。

在这两种情况下,您希望访问url.com,所以您可以将其与路由到posts#index进行匹配。然后可以将@posts变量的范围限定为适合您的最适合的设置。


设计

#config/routes.rb 
authenticate :user do 
    root "posts#user", as: :authenticated_root #-> url.com 
end 

unauthenticated :user do 
    root 'posts#index', as: :root #-> url.com 
end 

设计有authenticated && unauthenticated route helpers给你套不同的路线,取决于用户是否登录

有3个帮手总数:

  • authenticate - 如果用户在
  • authenticated记录 - 只有如果用户在(隐藏的其他时间)
  • unauthenticated记录 - 如果用户没有

登录您可以使用可以访问以下内容:

#app/controllers/posts_controller.rb 
class PostsController < ApplicationController 
    def index 
    @posts = Post.all 
    end 

    def user 
    @posts = current_user.posts 
    render :index 
    end 
end 

这与上述方法没有多大区别;你使用它的原因是如果你在流程中有明显的差异。 IE你在posts#index中设置的数据与posts#user完全不同。

在我的例子中,两种方法都使用index.html.erb;你可以很容易地将它们分开...

#app/views/posts/index.html.erb 
<% @posts.each do |post| %> 
    .... 
<% end %>