比如说我有一个帖子控制器,当前有一个方法user_posts
,它显示与用户关联的所有帖子,关联的ID如下:
def user_posts
@user = User.find(params[:id])
@posts = @user.posts.all
end
当帖子与我的current_user具有相同的ID时,我希望网址为:foo.com/my_posts
;我该怎么做?目前我的路线设置如下:
get 'user/posts/:id', to: 'posts#user_posts', as: 'user/posts'
我知道我可以为my_posts创建一个全新的控制器动作,但我想知道是否有办法在config / routes中进行。
例如,如果我在整个网站上浏览并点按一条链接,其中显示"用户帖子"我希望能够访问用户帖子,如果该用户恰好是我,我希望该网址显示website.com/my_posts
答案 0 :(得分: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])
希望它有所帮助。
答案 1 :(得分: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 %>
<强> 的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
,请通过从db中获取@user
来设置{。}}。
def user_posts
@user = params[:id].present? ? User.find(params[:id]) : current_user
@posts = @user.posts.all
end
无需检查routes.rb文件。这很简单,更多&#34; Rails&#34;等。
这是你在找什么?
答案 2 :(得分: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)