根据 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"喜欢
这是您要找的吗?
举例来说,我有一个帖子控制器,目前有一个方法 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"喜欢
这是您要找的吗?