根据current_user - ROR更改网址

时间:2017-03-18 04:54:20

标签: ruby-on-rails url routes controller-action

比如说我有一个帖子控制器,当前有一个方法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

3 个答案:

答案 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)