0

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 %>

コントローラーを正しく呼び出しても、コントローラーで属性を検証することはできません。

何をすればよいでしょうか?

ご協力いただきありがとうございます!

4

1 に答える 1

1

自分に:

最後に、実行されたアクションを識別するために、ボタンの 1 つに名前付きのフォームに 2 つの単純なボタンを追加して作成しました。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 に答える