1

我似乎无法弄清楚如何正确设置我的路线。

在我的应用程序中,我有一个视图可以让网站所有者更新他们的地址信息。newcreate操作是注册过程的一部分,位于signups_controller. 编辑更新操作位于settings_controller.

当用户进入设置区域时,他/她只看到编辑表单。填写完毕后,用户将返回到同一个表单,并显示一条闪现消息或错误消息。 这是控制器的外观:

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

指向该站点区域的链接是一个名为 linke 的基本 RESTful,带有参数选项:

edit_setting_path(:id => current_account.id)

当用户到达此页面时,他们会看到以下 URL:

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

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

http://domainname.com/settings/1

为什么 URL 会发生变化——我不希望它发生变化?有没有办法让它与初始编辑视图保持一致?我尝试对失败的更新进行重定向,但是我没有收到错误消息。

有任何想法吗?

4

2 回答 2

1

要回答您的“为什么”问题:URL 正在更改,因为它反映了失败请求的 URL - 在本例中是对该 URL (/settings/1) 的 PUT 请求。您已提交表单并且该表单的提交(正确)指向该 URL。这是助手为您提供的 RESTful 路由的结果。由于您的操作中的逻辑属于渲染:操作,因此没有重定向,并且表单只是使用此操作中可用的相同数据在页面上重新渲染(这就是您可以看到错误的原因)。

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

您可以将与 PUT 匹配的路由添加到 /settings/1/edit 并将其指向您的更新操作并更改您的表单等。简而言之,我不推荐这样做,但它应该可以工作。

完全未经测试但可以尝试:

路线.rb

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

您的表单还必须提交到 update_setting_path (这也意味着它不能重复用于新对象...... ew)

于 2012-04-18T17:39:50.520 回答
0

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

其次,要完成您想要做的事情,您需要通过match调用添加手动路由。你需要这样的东西。

match '/settings/:id/edit' => "settings#edit"
于 2012-04-18T16:47:12.443 回答