屏蔽控制器功能 - Rails3

时间:2012-08-21 13:50:18

标签: ruby-on-rails ruby-on-rails-3

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

配置/ routes.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吗?

2 个答案:

答案 0 :(得分:2)

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


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

如果找不到用户,这将首先尝试通过返回nil的id参数查找用户,如果返回值为nil,则会将@user设置为{{1的返回值帮助方法。这假设您使用Devise之类的内容,它提供了current_user方法来获取当前登录的用户。

另一个注意事项。您应该更改路线中的匹配,以指定只有获取请求对编辑操作有效。

current_user

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



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

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

答案 1 :(得分:0)

如果您想允许登录用户更改其个人资料,您可能希望在会话中存储用户的ID。

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

session[:user_id] = ...

然后你的编辑方法看起来像

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

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