2011-09-14 22 views
0

这是我的路线:即使我有一个范围的嵌套的路线,我的资源没有被路由正确 - 的Rails 3.1

scope ":username" do 
    resources :feedbacks 
end 

所以,当我去mydomain.com/test/feedbacks/10它显示了正确的feedbackid=10属于username=test

但是,如果我去mydomain.com/test2/feedbacks/10它显示与id=10相同的反馈,它不属于username=test2

如何限制这种情况发生?

我使用Vanity宝石给我在URL中的用户名,这是这条路线是什么样子:

controller :vanities do 
    match ':vname' => :show, :via => :get, :constraints => {:vname => /[A-Za-z0-9\-\+\@]+/} 
    end 

编辑1:

也就是说,为了清晰为什么当我去mydomain.com/test/feedbacks/10/test2/feedbacks/10时,它显示了我对同一个记录的相同观点(在这种情况下,后一个版本会是错误的,因为它应该告诉我没有这样的记录存在,但事实并非如此。显示test/feedbacks/10的正确记录)。

编辑2:

这里有两个请求的日志:

权请求

Started GET "/test-3/feedbacks/7" for 127.0.0.1 at 2011-09-14 02:48:15 -0500 
    Processing by FeedbacksController#show as HTML 
    Parameters: {"username"=>"test-3", "id"=>"7"} 
    Feedback Load (0.5ms) SELECT "feedbacks".* FROM "feedbacks" WHERE "feedbacks"."id" = ? LIMIT 1 [["id", "7"]] 
    User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = 3 LIMIT 1 
Rendered feedbacks/show.html.erb within layouts/application (36.2ms) 
Completed 200 OK in 188ms (Views: 184.3ms | ActiveRecord: 1.8ms) 

错误的请求

Started GET "/test2/feedbacks/7" for 127.0.0.1 at 2011-09-14 02:48:28 -0500 
    Processing by FeedbacksController#show as HTML 
    Parameters: {"username"=>"test2", "id"=>"7"} 
    Feedback Load (0.1ms) SELECT "feedbacks".* FROM "feedbacks" WHERE "feedbacks"."id" = ? LIMIT 1 [["id", "7"]] 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 3 LIMIT 1 
Rendered feedbacks/show.html.erb within layouts/application (37.6ms) 
Completed 200 OK in 50ms (Views: 47.5ms | ActiveRecord: 1.2ms) 
+0

您是否检查记录是否属于用户?这不会自动完成。 –

+0

请张贴您的#show动作代码,您应该查看参数[:用户名]并相应地加载您的用户记录。同样做@Benoit说。 –

回答

2

你的表演动作应该是这个样子

def show 
    @user = User.find_by_username(params[:username]) 

    if @user == current_user 
    ... 
    render "show" 
    else 
    flash[:alert] = "Record doesn't exist" 
    redirect_to root_path 
    end 
end 

我参加了@贝努瓦的建议添加的自由。

+0

Hrmm ...我还没有添加任何用户授权宝石(如declarative_authorization)。这就是为什么这不会限制它? – marcamillion

+0

身份验证如何? (从头开始设计,验证等)这一点不会限制它;但它确实允许您检查当前登录的用户是否与找到的记录相同。 Devise设置'current_user'方法。 –

+0

我还没有添加认证。首先构建应用程序的准系统功能。虽然我在完成本节后会添加Devise。如果Devise能够解决这个问题,那么我很好。只是想确保在设置我的自定义路由时不会错过路由问题。 – marcamillion