2016-02-12 47 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 %>