在Rails中使用嵌套资源路由时我注意到的一件事是,用户在技术上可以访问子资源存在的路径(因此可以正确显示),但父资源的id表示与子资源实际上没有关联的对象。
例如,在路线users/:user_id/post/:id
中,用户可以输入:user_id
代表未与:id
对应的帖子的用户的路线。
解决此问题的最佳方法是什么,以便在用户访问无效网址时,服务器会将用户重定向到正确的网址?
我已经在我的控制器中放了一些代码来处理这个问题,但是在每个控制器操作中检查路径然后将用户重定向到相应的url是很尴尬的,特别是因为每个操作的URL帮助程序都不同。
(edit_user_post_path(@user, @post)
,new_user_post_path(@user, @post)
)
必须有更好的方法,对吧?
答案 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/
玩得开心