Rails 4:自定义路线,单个模型的多个编辑表单

时间:2015-06-24 12:10:47

标签: ruby http ruby-on-rails-4 routes

我有一个Rails 4应用程序,其Thing模型有3个属性:attr_1,attr_2,attr_3。

我想有两种编辑形式:

  • 第一个会更新attr_1和attr_2
  • 第二个只会更新attr_3

我在thing_controller.rb中写了四个方法:

def edit
  #edit form for attr_1 & attr_2
end

def edit_attr_3
  #edit form for attr_3 only
end

def update
  #update attr_1 & attr_2
end

def update_attr_3
  #update attr_3 only
end

这是我的routes.db

resources :things do 
  member do
    get :edit_attr_3
    put :update_attr_3
  end
end

现在,GET编辑视图工作(/ things /:id / edit和/ things /:id / edit_attr_3)但是在提交时,事物#update表单被调用两次(事物#update_attr_3永远不会被调用)< / p>

我怎样才能将#edit_attr_3动作链接到#update_attr_3的东西?

编辑:

回答,感谢Ross&amp; Steve Klein

在我看来,我正在使用bootstrap_form_for。通常:url参数是可选的,因为标准编辑/更新按惯例链接。在自定义编辑或更新操作的情况下,必须指定更新路径。

<%= bootstrap_form_for @thing, url: update_attr_3_thing_path(@thing) do |f| %>
<% end %>

1 个答案:

答案 0 :(得分:2)

很难说没有看到你的表单的代码......但是如果你使用的是form_for那么它将在两种情况下映射到更新操作的路由(使用不是新对象的对象)。

要使其与您的唯一更新操作一起使用,您必须指定form_for应使用的网址。类似的东西:

<%= form_for @thing, url: things_update_attr_3_path(@thing) do |f| %>
  # other form stuff .......

您可以在命令提示符下使用bundle exec rake routes来查看当前路由是什么,以便您现在可以使用与表单相关的路由帮助程序。