在Ruby on Rails中设置根路由上的参数

时间:2016-02-12 04:37:29

标签: ruby-on-rails

我正在使用Rails 5.0.0.beta2构建共享博客。我希望无特权用户的root路由解析为users/:user_id/posts,这将显示所有用户帖子。当前配置的东西,路由定义为:

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

结果是:

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

但是服务的实际页面是“Yay,你在Rails上!”页。

有可能这样做吗?我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

  

所有用户都经过身份验证

所以你要问的是如何将“主页”@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

Devise让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 %>