私はこことここで同様のStackOverflowの質問を見つけましたが、それでもこれを機能させることはできません。
Rails 3.2.8、SimpleForm 2.0.4、およびTwitter Bootstrap 2.1.1を使用しています(bootstrap-sass gem 2.1.1.0経由)。
ユーザーは、モーダルポップアップウィンドウから連絡先を追加できる必要があります。検証エラーがある場合は、ユーザーがフォームの非モーダルバージョンを使用しているかのようにインラインで表示されます(フィールドの周囲に赤い境界線、フィールドの横にエラーメッセージが表示されます)。
私は次のようにモーダルをロードします:
<a data-toggle="modal" data-target="#new-contact-modal">Go modal!</a>
contacts/contact_fields
これがブートストラップモーダルです。これは、非モーダルバージョンで使用されているのと同じパーシャルを呼び出します。app / views / contacts / _new_modal.html.erb:
<div id="new-contact-modal" class="modal hide fade" tabindex="-1"
role="dialog" aria-labelledby="new-contact-modal-label"
aria-hidden="true">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"
aria-hidden="true">×</button>
<h3 id="new-contact-modal-label"><%= t("contacts.new.header") %></h3>
</div>
<%= simple_form_for(@contact,
:remote => true,
:html => {:class => "form-horizontal",
"data-type" => :json }) do |contact_form| %>
<div id="new-contact-body" class="modal-body">
<%= render 'contacts/contact_fields', :f => contact_form %>
</div>
<div class="modal-footer">
<%= contact_form.submit :class => "btn btn-primary",
:"data-loading-text"=> ('simple_form.creating') %>
<%= t('simple_form.buttons.or') %>
<a data-dismiss="modal" aria-hidden="true">
<%= t('simple_form.buttons.cancel') %>
</a>
</div>
<% end %>
</div>
app / controllers / contacts_controller.rbformat.json
( JavaScriptを使用してモーダル全体を送り返そうとしているため、意図的に行をコメントアウトしました):
def create
@contact = Contact.new(params[:contact])
<...some additional processing...>
respond_to do |format|
if @contact.save
format.html { flash[:success] = "Contact added."
redirect_to @contact }
format.json { render json: @contact, status: :created, location: @contact}
else
format.html { render action: "new" }
#format.json { render json: @contact.errors, status: :unprocessable_entity }
format.js { render 'new_modal_error' }
end
app / views / contacts / new_modal_error.js.erb
var modal = "<%= escape_javascript(render :partial => 'contacts/new_modal', :locals => { :contact => @contact.errors }) %>";
$("#new-contact-modal").html($(modal));
app/assets/javascripts/contacts.jsフォームをリセットして成功時にモーダルを閉じるためのJQuery。
$(function($) {
$("#new_contact")
.bind("ajax:success", function(event, data, status, xhr) {
// http://simple.procoding.net/2008/11/22/how-to-reset-form-with-jquery :
$(this).each(function(){
this.reset();
});
$("#new-contact-modal").modal("hide");
})
});
幸いなことに、これはフォームにエラーがない場合に機能します。連絡先が追加され、モーダルが非表示になります。ただし、検証エラーがある場合は、「JSON.parse:予期しない文字」というメッセージが表示されます。これは、return
このスニペットのステートメントであるjquery.jsの515行目からのものです。
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
調べてみるdata
と、それが私のファイルのコンテンツでありnew_modal_error.js
、フォームエラーで完全に展開され、JavaScript用にエスケープされていることがわかります。しかし、それはJSONではありません。
私は何が欠けていますか?new_modal_error.js
ページをJSON変数ではなくJavaScriptファイルとして処理するにはどうすればよいですか?または、これを完全に処理する簡単な方法はありますか?