如何在控制器只有编辑和更新时设置路由?

时间:2012-04-18 16:31:13

标签: ruby-on-rails routing routes

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

在我的应用中,我有一个视图,可让网站所有者更新其地址信息。 创建操作是注册过程的一部分,位于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

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

edit_setting_path(:id => current_account.id)

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

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

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

http://domainname.com/settings/1

为什么网址会发生变化 - 我宁愿不这样做?有没有办法让它与初始编辑视图保持一致?我尝试在失败的更新上进行重定向,但后来我没有收到错误消息。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

的routes.rb

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

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

答案 1 :(得分:0)

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

其次,要完成您要执行的操作,您需要通过match调用添加手动路由。你需要这样的东西。

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