我有一个名为User的模型,我想使用两个不同的视图来编辑它:通常的编辑视图和另一个我称为 edit_profile 的视图。
我在创建路由,控制器和视图方面没有问题:我添加了edit_profile和update_profile视图,并在routes.rb上添加了以下行:
map.resources :users ,:member => {:edit_profile => :get, :update_profile => :put}
问题是:当我在edit_profile中提交表单并且在某些输入字段中发生某些错误时,rails会重新加载edit_path页面而不是edit_profile_path页面! 这是edit_profile.html.erb
上的表单 form_for(:user, @user, :url => {:action => :update_profile}, :html => { :method => :put} ) do |f|
f.text_field :description
f.text_area :description
f.error_message_on :description
....
....
f.submit 'Update profile'
点击更新个人资料后,如果发生输入错误,我想显示edit_profile视图而不是编辑视图
问题出在哪里? 你有什么想法吗? 非常感谢
答案 0 :(得分:2)
向RESTful控制器添加额外的操作通常是代码味道,这表明有更好的方法来模拟您要执行的操作。在这种情况下,配置文件实际上是用户的子资源:
map.resources :users, :has_one => :profile
制作您的个人资料路线
GET /users/1/profile # show
GET /users/1/profile/edit #edit
PUT /users/1/profile # update
DELETE /users/1/profile #destroy
对于这些操作,您将拥有一个单独的ProfilesController ......更清洁。
如何对数据建模取决于您(您不必在模型和控制器之间建立一对一的关联!),但在这种情况下,我可能会使用ActiveRecord的聚合来建模用户和个人资料之间的关系。可以将其视为嵌入式has_one:http://api.rubyonrails.org/classes/ActiveRecord/Aggregations/ClassMethods.html
请注意,向RESTful控制器添加其他操作并不总是“错误”...由您决定何时将新操作拆分为单独的资源。然而,在这种情况下,我认为它非常明确!
答案 1 :(得分:1)
查看user_controller文件的更新方法。这就是提交编辑表单的地方。你会看到,如果记录无法更新,它会重定向回编辑方法。
执行所需操作的一种方法是使edit_profile表单指向一个新方法,可能称为update_profile,它与编辑方法相同,但在无法保存记录时重定向到edit_profile。
这样做的更好和干燥的方法可能是从您可以在现有更新方法中检测到的edit_profile表单中传递一个参数,以区分来自edit / edit_profile的更新尝试。
祝你好运!答案 2 :(得分:1)
您的控制器的操作(我假设为edit
操作)需要知道是否已通过正常的edit
页面或edit_profile
页面进行了操作。你可以使用一个名为profile
的隐藏字段来发布一个告诉它的面包屑。通过这样做,您可以根据profile
参数的存在来有条件地重定向。
更简洁的方法是创建一个名为edit_profile
的新操作,并将编辑代码提取到从edit
和edit_profile
调用的公共方法,让公共方法处理任何重定向