根据 current_user 更改 url - ROR

Change the url based on current_user - ROR

举例来说,我有一个帖子控制器,目前有一个方法 user_posts,它显示与具有关联 ID 的用户关联的所有帖子,如下所示:

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/routes.

中是否有办法做到这一点

例如,如果我正在浏览整个站点并点击 link 上面写着 "user posts" 我希望转到用户帖子,如果该用户恰好是我,我会喜欢url 显示 website.com/my_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

这允许帖子成为第一个 class 资源以及嵌套资源。现在,当您转到 /posts/ 时,您会看到所有帖子,但是当您转到 /users/:user_id/posts 时,您只会收到来自给定用户的帖子。

在您的应用中,当您需要link所有用户的所有帖子时,您可以

posts_path

当您只需要 link 一个用户的帖子时,您可以

user_posts_path(user)

据我所知 - 没有。可以在 routes 中创建重定向路由并检查一些条件(来自文档的示例):

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),从头开始生成'right'条路线。对于当前用户的帖子 link 不能像往常一样生成 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])

希望对您有所帮助。

如果我理解的很好,你有一个用户列表(包括当前连接的用户)并且每个用户都有一个link 'user posts'来查看用户的posts。

你可以简单地做:

观看次数

在您看来,根据用户id,更改用户post link。当您遍历用户时,检查 user 的 ID 是否与当前登录的用户相同。如果是,请将 link 更改为 /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

添加指向与 user/posts 相同的控制器方法的 my_posts 路由。

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

控制器

在您的控制器方法中,我们需要实例化 @user 以获取其 post。如果参数中没有 :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"喜欢

这是您要找的吗?