强制current_user路径

时间:2010-06-03 17:36:03

标签: ruby-on-rails ruby

目前,用户可以通过多种途径访问他们的“个人资料”。

  • 本地主机:3000 /用户/ CURRENT_USER
  • 本地主机:3000 /用户/电流
  • 本地主机:3000 /用户/ ID#

如何才能通过localhost:3000 / users / current_user

获取他们的“个人资料”

2 个答案:

答案 0 :(得分:1)

关于你的问题的“什么”的一个建议:而不是理想的网址是localhost:3000 / users / current_user我建议 localhost:3000 / user 或更具描述性的内容,例如 localhost:3000 / profile localhost:3000 / account

你能在routes.rb中加入这些条目吗?即使Authlogic等向您的应用添加路由,他们也应该在routes.rb中执行此操作。如果您有条目:

map.resource :users

然后就是/ users / 123路由的来源。我同意Matchu,即使你不使用/ users / 123,你也应该保留它并将其他请求发送给它。

额外的想法 如果你不想进入重定向中保留模型验证错误的(有点复杂,而不是很漂亮)业务,这是另一种方式。我假设您已经拥有map.resource:users,因此您在UsersController上有7个默认操作(索引,新建,创建,显示,编辑,更新,销毁)。

在您的routes.rb中:

map.profile 'profile', :controller => 'users', :action => 'show'
map.edit_profile 'profile/edit', :controller => 'users', :action => 'edit', :conditions => { :method => :get }
map.update_profile 'profile/edit', :controller => 'users', :action => 'update', :conditions => { :method => :put }

您需要稍微更新一下form_for标记:

<% form_for @user, :url => update_profile_path do |f| %> ...

现在,假设你开始使用/ profile,然后点击一个编辑链接,带你到/ profile / edit(应该显示表单),如果你填写表单使其验证失败,那么你应该重新开始/ profile /编辑f.error_messages输出中的正确错误。

您的编辑控制器代码应保持不变,您的更新代码应为:

def update
   @user = current_user || User.find(params[:id])
   if @user.update_attributes(params[:user])
     flash[:notice] = "Successfully updated user."
     redirect_to @user
   else
     render :action => 'edit'
   end
end

渲染(而不是重定向)保留@user模型的状态(包括错误),然后再次渲染编辑模板。由于您将其定向到update_profile_path,因此用户查看的网址仍为/ profile / edit。

答案 1 :(得分:0)

嗯,首先,删除您/users/current某个地方必须拥有的routes.rb路线。 (虽然我更喜欢/users/current/users/current_users,因为后者相当多余。)

对于/users/123,您可以在控制器中检查当前用户的ID是否与123或其他任何内容匹配,如果是,则重定向。

但我真的更喜欢相反的效果。将/users/current推送到/users/123在我的大脑中更有意义,因为它可以保持所有用户的路线一致,同时仍然允许您缓存到/users/current的链接。