2010-11-03 123 views
1

在一个Rails应用中,我有一个特殊的URL(/ profile)映射到用户控制器,允许用户查看和编辑他们的配置文件。我向路由文件中添加了以下条目,以便配置文件的“get”将路由到用户控制器中的配置文件操作,配置文件的“post”将路由到用户控制器中的update_profile操作。Rails路由问题

match '/profile', :to => 'users#profile', :via => "get" 
match '/profile', :to => 'users#update_profile', :via => "post" 

如果我跑耙路线我看到下面的两个条目

profile GET /profile(.:format) {:controller=>"users", ":action=>"profile"} 
profile POST /profile(.:format) {:controller=>"users", ":action=>"update_profile"} 

如果我尝试打dev的URL http://localhost:3000/profile它如预期带来了个人资料页面。如果我按表单按钮它给了我下面的错误:

Routing Error 

No route matches "/profile" 

望着初始页我看到下面的表单标签上生成的HTML,所以它看起来动作的设置是否正确。

<form accept-charset="UTF-8" action="/profile" class="edit_user" enctype="multipart/form-data" id="edit_user_1" method="post"> 

那么我错过了什么?通过查看耙路输出,我认为这将工作。我是否错误地考虑了我的http动词?任何帮助,将不胜感激。

回答

0

我在这里看到一些问题。

首先,这些是针对特定用户的操作。所以路线应该可能是'profile/:id'

其次,show和update是在脚手架资源时自动生成的。重命名操作并将其映射到自定义URL有什么好处?打破自动生成的Rails RESTful路由通常会遇到麻烦。它可以完成,但你应该有一个很好的理由去做。

第三,你的路线看起来很有趣。有一些报价不应该在那里。当你运行耙路线时,它们是如何出现在控制台中的?

+1

/profile的概念仅适用于当前用户,如果您未登录系统,则不会访问该页面,因此在此情况下不需要:id。我们正在使用用户控制器生成的url来管理管理功能,这与我们希望用户拥有自己的配置文件的用户体验不同。因此,系统管理员使用编辑操作来编辑现有用户,其中配置文件操作将提供为当前登录的用户定制的不同体验。是的,这就是它在控制台中的显示方式。 – 2010-11-03 21:33:04

+1

这使得更多的意义。在那种情况下,唯一让我感到有趣的是实际的路线。在之前不应该有一个报价:行动,你不同意吗?我唯一能想到的尝试就是始终使用双引号。在你的路线中,你有一些字符串单引号和其他人的双引号。它不应该有所作为,但它是值得一试。 – Samo 2010-11-04 15:29:16