デフォルトのアクションオプション
まずはじめに、Rails Adminのアクションにはこんなデフォルトオプションがあるよ、というご紹介。
オプションのデフォルト値一覧は以下のファイルに書かれている。
rails_admin/lib/rails_admin/config/actions/base.rb
-
register_instance_option :collection?
- モデル単位のアクションか
- デフォルト値: false
-
register_instance_option :member?
- オブジェクト単位のアクションか
- デフォルト値: false
-
register_instance_option :controller
- コントローラーアクションの中身
-
register_instance_option :bulkable?
- 一括更新か
- デフォルト値: false
- モデル単位のアクションのみ
- コントローラー内で params[:bulk_ids] を処理する必要がある
-
register_instance_option :http_methods
- 扱うHTTPメソッド
- デフォルト値: [:get]
などなど。
アクションコントローラーの追加
RailsAdminでアクションコントローラーを作成すると、下記のようにタブが追加される。
今回は表示順を変更し、一括で保存するアクションを作成した。
手順
1. lib配下にファイルの作成(今回は display_order_action.rb とした)
display_order_action.rb
# 以下2つのファイルを require する
require "rails_admin/config/actions"
require "rails_admin/config/actions/base"
module RailsAdmin
module Config
module Actions
class DisplayOrderAction < RailsAdmin::Config::Actions::Base
RailsAdmin::Config::Actions.register(self)
# カスタムコントローラを作成するため、以下を true にする
register_instance_option :collection? do
true
end
register_instance_option :bulkable do
true
end
register_instance_option :http_methods do
[:get, :put]
end
# コントローラーアクションの処理
register_instance_option :controller do
Proc.new do
if request.get?
# 一覧表示 (モデル内容を全て取得)
@objects = list_entries(@model_config, :destroy, get_association_scope_from_params, false)
elsif request.put?
# 表示順の更新
objects = list_entries(@model_config, :destroy)
params[:products].each do |params_product|
object = objects.find(params_product[:id])
object.update_attributes(order: params_product[:order])
end
redirect_to(:back)
else
raise "エラーメッセージ"
end
end
end
end
end
end
end
2. config/initializers/rails_admin.rb にカスタムアクションの存在を明記する
rails_admin.rb
# 先頭で使用するファイルを require する
require Rails.root.join('lib', 'display_order_action.rb')
RailsAdmin.config do |config|
config.actions do
dashboard # mandatory
index # mandatory
new
export
bulk_delete
show
edit
delete
# カスタムアクションを宣言
display_order_action
end
end
3. app/views/rails_admin/main 配下に表示する viewファイルを用意する(今回は display_order_action.html.erb とする)
display_order_action.html.erb
<%= form_tag("", method: "put") do %>
<table class="table table-striped table-bordered">
<tr>
<th>Name</th>
<th>Order</th>
</tr>
<% @objects.each do |object| %>
<tr>
<td><%=object.name%></td>
<td><input type="number" value="<%=object.order%>" name="products[][order]"></td>
<input type="hidden" value="<%=object.id%>" name="products[][id]"/>
</tr>
<% end %>
</table>
<%= submit_tag("更新") %>
<% end %>
所感
苦しみを感じた。
参考資料
rails_adminをカスタマイズする方法まとめ