1

在 Rails 中使用嵌套资源路由时我注意到的一件事是,从技术上讲,用户可以访问子资源存在的路由(因此可以正确显示),但是父资源的 id 表示一个对象实际上与子资源无关。

例如,在路由users/:user_id/post/:id中,用户可以输入一个路由,其中:user_id​​表示没有发布对应于 的帖子的用户:id

解决此问题的最佳方法是什么,以便如果用户访问无效的 URL,服务器会将用户重定向到正确的 URL?

我已经在我的控制器中放置了一些代码来处理这个问题,但是必须检查每个控制器操作中的路径然后将用户重定向到适当的 url,这有点尴尬,特别是因为每个操作的 URL 帮助程序都不同。

( edit_user_post_path(@user, @post), new_user_post_path(@user, @post))

必须有更好的方法,对吧?

4

2 回答 2

2

您应该before_filter运行所有请求以确保用户有效。如果没有,它将抛出ActiveRecord::RecordNotFound并显示友好的 404 页面。

然后根据用户的需要抓取帖子,无论是在另一个before_filter还是直接在动作中。基于用户的帖子搜索。我下面的示例演示了如何使用另一个before_filter.

before_filter :find_user_by_user_id
before_filter :find_post

def show
  # Use @post variable here however you need
end

private

def find_user_by_user_id
  @user = User.find(params[:user_id])
end

def find_post
  # This assumes you have an association set up as needed
  @post = @user.posts.where(id: params[:id]).first

  if @post.nil?
    # Do whatever you need here
  end
end
于 2012-08-08T17:57:42.623 回答
0

首先,您应该知道 ROR 引发的错误将在生产环境中显示消息“对不起,但您要查找的页面不存在”。

因此,我不会担心这一点。如果您想“捕获”故障并快速重定向到您可能有兴趣使用该rescue方法的安全区域。

http://www.simonecarletti.com/blog/2009/12/inside-ruby-on-rails-rescuable-and-rescue_from/

玩得开心

于 2012-08-08T14:25:26.667 回答