我正在使用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上!”页。
有可能这样做吗?我该怎么做呢?
答案 0 :(得分:2)
所有用户都经过身份验证
所以你要问的是如何将“主页”@posts
的范围扩展到current_user
的范围。
有两种方法(Controller
和Devise
):
<强>控制器强>
#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 %>