我正在寻找一个解决方案,在整个表单在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 %>
即使它正确调用控制器,我也不会在控制器中验证属性。
我该怎么办?
感谢您的帮助!
答案 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基础。多么可怜!
干杯...
我是一个可怜的寂寞牛仔...