2012-09-20 25 views
0

我正在寻找一种解决方案,以便在整个窗体的导航之前对嵌套资源进行预先验证,并且对正确的设计没有任何线索。嵌套窗体中的多个动作 - 传递给属性link_to

所以我有has_one :place正在接受嵌套属性的简单User模式:

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

要我自:

我终于通过,以确定所采取的行动增加了两个简单的按钮形式与名称的按钮中的一个成功了。我只是遵循以下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 

唯一缺少的一点是,它不是阿贾克斯基地。多么可怜!

干杯......

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