修正Rails中的无效资源路由

时间:2012-08-08 14:06:45

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 routes nested-routes

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

例如,在路线users/:user_id/post/:id中,用户可以输入:user_id代表未与:id对应的帖子的用户的路线。

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

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

因此,我不会那么担心。如果您想“捕获”失败并快速重定向到安全区域,您可能会对使用rescue方法感兴趣。

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

玩得开心