2012-04-18 34 views
1

我似乎无法弄清楚如何让我的路线设置正确。如何在控制器仅编辑和更新时设置路由?

在我的应用程序中,我有一个让网站所有者更新其地址信息的视图。 创建行动是注册过程的一部分,位于signups_controller编辑更新行动在settings_controller

当用户进入设置区域时,他/她只能看到编辑表单。填写后,用户将返回到相同的表单,并显示一条Flash消息或错误消息。 这里是控制器的样子:

class SettingsController < ApplicationController 

    def edit 
    @account = current_account 
    @account.companies.first 
    @account.companies.first.addresses.first 
    @account.companies.first.phones.first 
    end 

    def update 
    @account = current_account 
    if @account.update_attributes(params[:account]) 
     redirect_to edit_setting_path 
     flash[:notice] = "Success!" 
    else 
     render :edit 
    end 
    end 
end 

在我的路线,我只是有:

resources :settings 

链接到这方面的网站的是一个基本的REST风格的命名临客,与该参数选项:

edit_setting_path(:id => current_account.id) 

当用户到达这个页面,他们看到了以下网址:

http://domainname.com/settings/1/edit 

当他们提交表单,并得到错误的URL更改为:

http://domainname.com/settings/1 

为什么网址改变 - 我宁愿不呢?有没有办法让它保持与初始编辑视图相同?我试过对失败的更新做重定向,但是我没有收到错误消息。

任何想法?

回答

1

要回答你的“为什么”的问题:该URL正在改变,因为它反映了失败请求的URL - 在这种情况下是一个PUT请求到URL(/设置/ 1)。您已提交表单并正确提交了该表单(指向该URL)。这是帮助程序为您提供的RESTful路由的结果。由于动作中的逻辑落在了render:action中,因此没有重定向,表单只是使用此操作中可用的相同数据在页面上重新呈现(这就是为什么您可以看到错误)。

如果您想重定向回编辑页面,那么您将失去在@account实例变量中设置的错误,因为重定向将重置(重新查询)该帐户。

你可以添加一个匹配PUT到/ settings/1/edit的路由,并将它指向你的更新动作并更改你的表单等。总之,我不会推荐这个,但它应该工作。

完全未经测试,但attemptable:

的routes.rb

put "/settings/:id/edit", :to=>"settings#update", :as=>"update_setting" 
resources :settings, :except=>:update 

你的表格也必须提交update_setting_path(这也意味着它不是可重复使用的新对象...... EW)

+0

无论如何要保持错误,但避免更改URL? – Nathan 2012-04-18 17:45:29

+0

是的,最后一段。虽然我会把它称为一种黑客。 – miked 2012-04-18 17:46:52

+0

是的,这是诀窍。但它似乎并不罕见 - 我错了吗?另外,如果我使用AJAX的形式,这是否也解决了这个问题? – Nathan 2012-04-18 18:08:05

0

首先您应该阅读The Rails Guides for Routing。他们会帮助我们理解为什么它会这样工作。

其次,要完成您正在尝试执行的操作,您需要通过match呼叫添加手动路线。你需要这样的东西。

match '/settings/:id/edit' => "settings#edit" 
+0

这并没有改变行为。 它增加了一个新线在我的路线: '/settings/:id/edit(.:format)设置#edit' 但在更新失败,我仍然得到: 'HTTP://域名.com/settings/1' – Nathan 2012-04-18 16:59:19

+0

您是否删除了资源设置? – 2012-04-18 18:17:58

相关问题