このブログ エントリでは、coffeescript を使用しています。Rails フォームでオプションを使用しているとします。次に、アセット パイプライン:confirm
のファイルに次のコードを追加して、Rails のデフォルト アクションをオーバーライドする必要があります( )。<controller>.js.coffee
app/assets/javascript
$.rails.allowAction = (link) ->
return true unless link.attr('data-confirm')
$.rails.showConfirmDialog(link) # look bellow for implementations
false # always stops the action since code runs asynchronously
$.rails.confirmed = (link) ->
link.removeAttr('data-confirm')
link.trigger('click.rails')
$.rails.showConfirmDialog = (link) ->
message = link.attr 'data-confirm'
html = """
<div class="modal" id="confirmationDialog">
<div class="modal-header">
<a class="close" data-dismiss="modal">×</a>
<h3>#{message}</h3>
</div>
<div class="modal-body">
<p>Are you sure you want to delete?</p>
</div>
<div class="modal-footer">
<a data-dismiss="modal" class="btn">Cancel</a>
<a data-dismiss="modal" class="btn btn-primary confirm">OK</a>
</div>
</div>
"""
$(html).modal()
$('#confirmationDialog .confirm').on 'click', -> $.rails.confirmed(link)
次に、ビューで次のようなリンクを使用すると、標準のブラウザー ポップアップの代わりに Bootstrap モーダルが表示されます。
<%= link_to 'Delete', item, :method => :delete, :confirm=>'Are you sure?' %>
アップデート
これは、:remote => true
オプションを使用しても機能します。
したがって、index.html.erb ビューに次のようなものがあるとします。
<table>
<tr>
<th>Name</th>
<th>Title</th>
<th>Content</th>
<th></th>
<th></th>
<th></th>
</tr>
<% @posts.each do |post| %>
<tr id="<%= post.id %>">
<td><%= post.name %></td>
<td><%= post.title %></td>
<td><%= post.content %></td>
<td><%= link_to 'Show', post %></td>
<td><%= link_to 'Edit', edit_post_path(post) %></td>
<td><%= link_to 'Destroy', post, method: :delete, :remote => true, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</table>
また、コントローラの destroy アクションにはformat.js
、respond_to があります。
# DELETE /posts/1
# DELETE /posts/1.json
def destroy
@post = Post.find(params[:id])
@post.destroy
respond_to do |format|
format.js
format.html { redirect_to posts_url }
format.json { head :no_content }
end
end
そして、これは destroy.js.erb で:
$("tr#<%= @post.id %>").fadeOut();
その後、すべてが機能します。リンクをクリックするDestroy
と、Bootstrap の確認ダイアログが表示され、[OK] をクリックすると、行がフェードアウトしてサーバー上で破棄されました。