嵌套表单中的多个操作 - 在link_to中传递的属性

时间:2012-09-20 14:07:33

标签: ruby-on-rails nested-attributes

我正在寻找一个解决方案,在整个表单在rails中提交之前对嵌套资源进行预验证,并且对正确的设计没有任何线索。

所以我有一个简单的User模型,has_one :place被嵌套属性接受:

class User < ActiveRecord::Base
   ...

   has_one :place, :dependent => :destroy
   accepts_nested_attributes_for :place
   attr_accessible :place_attributes
   ...
end

Place模型包含:street_number, :street, :postal_code, :city, :country

等属性

我想设置一个用户编辑表单,以便他可以介绍这个地方。在提交之前,我想让用户有机会验证这个地方。所以我在PlaceController

中设置了自定义操作
# place_controller.rb
class PlaceController < ApplicationController
   ...
   def validate
      # code for validation
   end
 end

顺便说一下,我为这个地方定义了路线如下:

# route.rb
resources :users do
  resource :place do
    match 'validate', :to => 'place#validate'
  end
end

然后在视图中我设置了表单:

<%= form_for(:user, :url => edit_user_path(@user), :html => {:method => :put, :multipart => true}) do |f| %>
 <%= f.text_field :name %>
 # other fields for users
 ...
 <%= f.fields_for :place do |builder| %>
   <%= render 'places/form', :f => builder %>
 <% end %>

 <%= f.submit "Update" %>
   

部分places/form管理place的嵌套属性的字段:

<%= f.text_field :street_number %>
<%= f.text_field :street %> 
...

以下是重点:我想要一个提交或链接,使用地点模型的属性调用validate操作。 我试过像:

<%= link_to 'Validate', validate_user_place_path(@user, :format => :js, :params_to_validate => f.object), :remote => true %>

即使它正确调用控制器,我也不会在控制器中验证属性。

我该怎么办?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

对我自己:

我终于通过在表单中​​添加两个简单的按钮来创建它,其中一个按钮的名称是为了识别所采取的操作。我只是遵循以下railscast背后的想法:Railscast 38

所以在视图中:

<%= f.submit 'Validate', :name => 'validate_place' %>
<%= f.submit 'Update' %>

User控制器中,我检查update操作中的按钮:

def update

 if params[:validate_place] 
    #validation of place is performed

 else
    #user is updated
 end
end

唯一缺失的一点是它不是ajax基础。多么可怜!

干杯...

我是一个可怜的寂寞牛仔...