編集:私はモデルレベルで検証を使用していることを言及するのを忘れました、そしてそれはうまくいきます。そのため、検証によってモーダルフォームの送信が妨げられています(そしてajax:errorが呼び出されています)が、結果のエラーオブジェクトを処理してエラーを適切に表示することができません。今のところ、プレースホルダーテキスト(「FORMHASERRORS」)を使用しています。繰り返しますが、検証とエラーの表示は、私の非モーダル(非ajax)フォーム(エラーメッセージを部分的に使用している)で正常に機能しています。モーダルダイアログボックスでその部分をレンダリングできればと思います。これは簡単だと思います。
これで髪を抜いています。
「ツアーの追加」フォームがあり、そのフォーム内でデータベースから建物を選択してツアーに追加できます(jquery tokeninputを使用して建物を検索および選択しています)。それはすべてうまくいきます。
モーダルフォームを表示する[建物の追加]リンクを提供することで、ユーザーが新しい建物を追加できる機能を追加しました。結果を処理すると、すべてがうまく機能します(建物が保存される、モーダルが却下される、トークンが追加されるなど)。
モーダル形式での検証を除いて、すべてがうまく機能します。。。これはまったく機能しません。client_side_validationsを試したり、コントローラーから返されたエラーオブジェクトを反復処理するコーヒースクリプトを記述したりしました。
とにかく、私は私が試すことを知っているすべてを試したので、今私はあなたたちに助けを求めに来ています。今のところ、私はコーヒースクリプトファイルにプレースホルダーエラー処理コードを持っています(これは非常に基本的な方法で「FORMHASERRORS」を表示するだけです)。醜くなってきたので、これまでの試みをすべてやめました。本当にこれを行うための最良の方法を探しています。
関連するファイルは次のとおりです。
building.js.coffee
$ ()->
$("form.new_building").on "ajax:success", (event, data, status, xhr) ->
$("form.new_building")[0].reset()
$('#new-building-modal').modal('hide')
fulladdress = "#{data.address} (#{data.name}, #{data.city}, #{data.zip})"
$('#tour_building_tokens').tokenInput("add", {id: data.id, address: fulladdress} )
$("form.new_building").on "ajax:error", (event, xhr, status, error) ->
$('#display_errors').append('<font color="red"><strong>FORM HAS ERRORS</strong></font><br><br>')
$('#display_errors').show()
building_controller.rb
....
def create
@building = Building.new(params[:building])
respond_to do |format|
if @building.save
format.html { redirect_to @building, notice: 'Building Created!' }
format.json { render json: @building, status: :created, location: @building }
else
format.html { render 'new' }
format.json { render json: @building.errors, status: :unprocessable_entity }
end
end
end
new.html.erb
<% provide(:title, 'Add Tour') %>
<h1>Add Tour</h1>
<div class="row">
<div class="span6 offset3">
<%= form_for(@tour) do |f| %>
<%= render 'fields', f: f %>
<%= link_to 'Add Building', '#new-building-modal', 'data-toggle' => "modal" %>
</br>
</br>
<%= f.submit "Add Tour", class: "btn btn-large btn-primary" %>
<% end %>
</div>
</div>
<div id='new-building-modal' class='modal hide fade'>
<div class = "modal-body">
<%= form_for(Building.new, remote:true, html: {"data-type" => :json}) do |f| %>
<div id="display_errors" style="display:none;">
</div>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :address %>
<%= f.text_field :address %>
<%= f.label :city %>
<%= f.text_field :city %>
<%= f.label :zip %>
<%= f.text_field :zip %>
</div>
<div class = "modal-footer">
<%= f.submit "Add Building", class: "btn btn-large btn-primary" %>
</div>
<% end %>
</div>
ああ、そして私は現在このモーダルで使用していない部分的な共有エラーメッセージも持っています(エラーを表示するためにモーダルを「更新」することができなかったため)。完璧な世界では、これと同じパーシャルをモーダルで使用します。これは、他の非モーダルフォームでうまく機能するためです。
これが部分的です(これも、現在上記のコードではレンダリングされていません)。
<% if object.errors.any? %>
<div id="error_explanation">
<div class="alert alert-error">
The form contains <%= pluralize(object.errors.count, "error") %>.
</div>
<ul>
<% object.errors.full_messages.each do |msg| %>
<% if msg != "Password digest can't be blank" %>
<li>* <%= msg %></li>
<% end %>
<% end %>
</ul>
</div>
誰もが提供できる助けを事前に感謝します。できるだけ詳細が必要です。Stack Overflowに関する関連する質問を調査しましたが、近くにいると思うたびに空っぽになります。