Rails 3.2でWebアプリケーションを構築しています。ここでは、複数のアドレスが関連付けられている個人モデルがあります。今、私はその人の編集ウィンドウから新しいアドレスを追加しようとしています。
ページのレイアウトを作成するには、ブートストラップを使用します。
簡単な編集ビューを作成しました。人のすべての詳細を編集でき、それに関連付けられた住所を示す簡単なテーブルがあります。このビューはsimple_form_forで作成され、リモートタグがtrueに設定されていません。
表の下には、新しいアドレスのビューをリモートでロードするボタンがあります。これは、次のコードで実行されます。
=link_to 'Add new address', new_address_path(:addressable_id => @person.id, :addressable_type => @person.class.name), :data => {:toggle => "modal", :target => "#newAddressWindow"}, :remote => true, :class => 'btn'
.modal#newAddressWindow{:style => "display: none;"}
これにより、ブートストラップから次のコードを介してモーダルダイアログに新しいフォームが読み込まれます。
アドレス_コントローラー:
def new
@address = Address.new
@address.addressable_type = params[:addressable_type]
@address.addressable_id = params[:addressable_id]
respond_to do |format|
format.html
format.json { render json: @address }
format.js
end
end
アドレス/new.js.erb
if ($("#newAddressWindow").is(':empty')) {
$("#newAddressWindow").append(
"<%= escape_javascript(render :partial => 'form') %>"
);
}
アドレス/_form.html.haml
= simple_form_for(@address, :remote => true) do |f|
.modal#myModal
.modal-header
%button.close{:href => "#", :data => {:dismiss => "modal"}}x
%h3 Adres
.modal-body
= f.input :postal_code
= f.input :number
= f.input :city
= f.input :addressable_id, :as => :hidden
= f.input :addressable_type, :as => :hidden
.modal-footer
%a.btn{:href => "#", :data => {:dismiss => "modal"}} Close
= f.button :submit, :class => "btn-primary"
今、私が欲しいのは、住所を提出し、その人のテーブルに新しく提出された住所を表示することです。しかし、送信ボタンを押すと、アドレスの作成アクションは通常のhtml呼び出しとして呼び出されます。これは、サーバーログからわかるように、フォームにリモートがあるため、サーバーへのajax呼び出しであると予想されていました。送信後、サーバーはアドレスの作成ページもリダイレクトします。
これは私がサーバーログに見るものです:
2012-05-09 13:10:14 +0200に84.107.25.142のPOST「/addresses」を開始しました。AddressesController#createによるHTMLとしての処理
パラメータ:{"utf8" => "✓"、 "authenticity_token" => "WBBKxMftlsvHF5B6zgJw / wtBdF4IibquJQ6HrM6b0cQ ="、 "address" => {"postal_code" => "5"、 "number" => "6"、 "city "=>" 7 "、" addressable_id "=>" 2 "、" addressable_type "=>" Person "}、" commit "=>"Create Address "}
そして、これはアドレスコントローラの作成アクションです
def create
@address = Address.new(params[:address])
respond_to do |format|
format.html
format.json { render json: @address }
format.js
end
end