0

我正在寻找一种解决方案,以便在提交整个表单之前对嵌套资源进行预验证,并且不知道正确的设计。

所以我有一个简单的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 %>

即使它正确调用了控制器,我也没有得到要在控制器中验证的属性。

我该怎么办?

谢谢你的帮助!

4

1 回答 1

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 基础。真可惜!

干杯...

我是一个可怜孤独的牛仔...

于 2012-10-03T12:52:37.697 回答