2017-03-18 57 views
2

例如說我有,目前有一個方法user_posts這說明所有與使用相關的ID的用戶爲使相關的職位的職位控制器:更改基於CURRENT_USER網址 - ROR

def user_posts 
    @user = User.find(params[:id]) 
    @posts = @user.posts.all 
end 

我希望URL爲:foo.com/my_posts當帖子的ID與我的current_user相同時;我將如何做到這一點?目前我的路由設置爲這樣:

get 'user/posts/:id', to: 'posts#user_posts', as: 'user/posts' 

我知道我可以創建my_posts一個全新的控制器動作,但我想知道是否有辦法做到這一點在config /路線。

如果例如我瀏覽整個網站,並點擊一個鏈接,說「用戶帖子」我希望去的用戶帖子,如果該用戶恰好是我我想要的網址顯示website.com/my_posts

回答

1

如果我理解的很好,你有一個用戶列表(包括當前連接的用戶),並且每個用戶都有一個鏈接'user posts'來查看用戶的帖子。

你可以簡單地做:

意見

在你的意見,根據用戶標識更改用戶帖子鏈接。在循環訪問用戶時,請檢查user的ID是否與當前記錄的用戶相同。如果是的話,更改鏈接到/my_posts路線如下:

<% if user.id == current_user.id %> 
    <%= link_to "My posts", my_posts_path %> 
<% else %> 
    <%= link_to "User posts", user_posts_path(user) %> 
<% end %> 

的routes.rb

添加my_posts路徑指向同一個控制器的方法user/posts

get 'user/posts/:id', to: 'posts#user_posts', as: 'user/posts' 
get 'my_posts', to: 'posts#user_posts', as: 'my_posts' 

控制器

在你的控制器的方法,我們需要實例化@user以獲取其職位。如果參數中沒有:id(如/my_posts路由),則將@user設置爲current_user。如果通過了:id,則通過從數據庫中獲取@user來設置它。

def user_posts 
    @user = params[:id].present? ? User.find(params[:id]) : current_user 
    @posts = @user.posts.all 
end 

不需要檢查routes.rb文件。這很簡單,更像「Rails」之類的。

這是你在找什麼?

+0

完美!是的,這正是我正在尋找的。簡單而優雅的答案。用一點點細節解釋每一部分,我會獎勵賞金。 –

+0

很高興能幫到你!我詳細解釋了我的答案。 – Jeremie

0

我猜你不想使用posts控制器的索引方法,因爲你用它來顯示所有用戶的所有帖子,但是你仍然可以使用它。具體方法如下:

class PostsContoller < ApplicationController 
    def index 
    @posts = if params[:user_id].present? 
       User.find(params[:user_id]).posts 
      else 
       Post.all 
      end 
    end 
end 

然後在你的路線文件做到這一點:

resources :posts 
resources :users do 
    resources :posts 
end 

這樣的帖子是一個一流的資源和嵌套資源。現在,當您轉到/posts/時,您將獲得所有帖子,但是當轉到/users/:user_id/posts時,您將只獲得給定用戶的帖子。

在你的應用程序中,當您需要鏈接到所有用戶的所有帖子,你可以做

posts_path

,當你需要鏈接到只是一個用戶的帖子,你可以做

user_posts_path(user)

+0

如果帖子是我的,我想將網址更改爲/ my_posts。 –

1

據我所知 - 沒有。這是可能的routes重定向路徑創建和檢查一些條件(例如,從documantation):

get 'jokes/:number', to: redirect { |params, request| 
    path = (params[:number].to_i.even? ? "wheres-the-beef" : "i-love-lamp") 
    "http://#{request.host_with_port}/#{path}" 
} 

但它不可能在routes檢查current user。如前所述,可以在控制器中使用兩個單獨的操作來實現重定向。

另外還有一個小技巧 - 如果你使用html.erb(slim/haml),從一開始的'正確'路線生成。對於當前用戶帖子的鏈接可以生成沒有像往常那樣user/posts/:id/my_posts(它可以檢查當前用戶ID沒有任何問題),並定義了兩條路線:

get 'user/posts/:id', to: 'posts#user_posts', as: 'user/posts' 
get 'my_posts', to: 'posts#user_posts', as: 'my_posts' 

在控制器檢查request.path找到用戶:

user = request.path == '/my_posts' ? current_user : User.find(params[:id]) 

希望它有幫助。