0

我想隐藏或屏蔽example.com/users/$ID/editexample.com/profile/edit

配置/路由.rb

resources :users

应用程序/控制器/users_controller.rb

def edit
@user = User.find(params[:id])
end

我试过添加路线

match '/profile/edit' => 'users#edit', :as => :edit_profile

但是,当我访问example.com/profile/edit时,编辑方法抱怨无法找到用户的 ID。

有没有办法可以从浏览器中屏蔽 ID?

4

2 回答 2

2

如果您尝试编辑当前用户的个人资料,您可以在编辑操作中使用以下内容:


    def edit
      @user = User.find_by_id( params[:id] ) || current_user
    end

如果找不到用户,这将首先尝试通过返回 nil 的 id 参数查找用户,如果返回值为 nil,它将设置@usercurrent_user辅助方法的返回值。这假设您正在使用像Devise这样的东西,它提供了current_user获取当前登录用户的方法。

另一个注意事项。您应该更改路由中的 match 以指定只有 get 请求对编辑操作有效。



    get 'profile/edit' => 'users#edit' , as: edit_profile

如果您试图阻止用户编辑其他人的个人资料,则在加载用户后需要以下内容:



    redirect_to( root_path ) and return unless @user == current_user

这将使当前用户无法编辑其他用户的个人资料。

于 2012-08-21T14:12:19.163 回答
0

如果您想允许登录用户更改其个人资料,也许您需要将用户的 ID 存储在会话中。

因此,当用户登录时,您将其 ID 保存到会话中:

session[:user_id] = ...

然后您的编辑方法将如下所示

def edit
  @user = User.find(session[:user_id])
end

如果该解决方案不是您想要的,那么您可能只需要将 ':id' 参数添加到匹配代码中。

于 2012-08-21T14:09:46.817 回答