目前,用户可以通过许多路径访问他们的“配置文件”。
如何使他们只能通过本地主机:3000/users/current_user访问他们的“配置文件”?
发布于 2010-06-03 18:00:12
关于您问题的“什么”的一个建议:我建议使用localhost:3000/user或者更具有描述性的东西,比如localhost:3000/profile或localhost:3000/account.,而不是理想的url是localhost:3000/user/current_user
你能在你的routes.rb中包括这些条目吗?即使Authlogic等为您的应用程序添加了路由,他们也应该在routes.rb中这样做。如果您有以下条目:
map.resource :users然后,这就是/user/123路由的来源。我同意Matchu的观点,即使您不使用/user/123,您也应该保留它,并将其他请求路由到它。
如果您不想进入跨重定向保存模型验证错误的业务(有点复杂,但不太好),那么还有一个新的想法,这里有另一种方法。从这里开始,我假设您已经有了map.resource : UsersController,所以您的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,用户查看的url仍然是/profile/编辑。
发布于 2010-06-03 17:40:37
嗯,首先,删除/users/current路由,您必须在您的routes.rb中的某个地方。(虽然我更喜欢/users/current而不是/users/current_users,因为后者是相当冗余的。)
至于/users/123,在您的控制器中,您可以检查当前用户的ID是否与123或其他什么匹配,如果匹配,可以重定向。
但我真的更喜欢相反的效果。在我的大脑中,将/users/current推到/users/123更有意义,因为它使所有用户的路由保持一致,同时仍然允许您缓存到/users/current的链接。
https://stackoverflow.com/questions/2968384
复制相似问题