2

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

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

我希望 url 是:foo.com/my_posts当帖子与我的 current_user 具有相同的 ID 时;我该怎么做?目前我的路线设置如下:

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

我知道我可以为 my_posts 创建一个全新的控制器操作,但我想知道在配置/路由中是否有办法做到这一点。

例如,如果我浏览整个网站并点击显示“用户帖子”的链接,我希望转到用户帖子,如果该用户恰好是我,我希望显示 urlwebsite.com/my_posts

4

3 回答 3

1

据我所知 - 不。可以在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}"
}

但是无法办理current user入住routes。重定向可以在控制器中实现,如前所述,有两个单独的操作。

还可以使用一个小技巧 - 如果您使用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])

希望能帮助到你。

于 2017-03-30T06:30:43.050 回答
1

如果我理解得很好,你有一个用户列表(包括当前连接的用户),每个用户都有一个链接“用户帖子”来查看用户的帖子。

你可以简单地做:

意见

在您看来,根据用户 ID 更改用户帖子链接。当您遍历您的用户时,请检查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 %>

路线.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”。

这是你想要的?

于 2017-04-03T02:02:07.580 回答
0

我猜你不想使用帖子控制器的 index 方法,因为你使用它来显示所有用户的所有帖子,但你仍然可以使用它。就是这样:

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)

于 2017-03-18T06:30:34.287 回答