LoginSignup
7
5

More than 5 years have passed since last update.

Rails Admin:Custom Actionの追加

Posted at

デフォルトのアクションオプション

まずはじめに、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でアクションコントローラーを作成すると、下記のようにタブが追加される。
今回は表示順を変更し、一括で保存するアクションを作成した。

display_order_tab.png

手順

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 %>

所感

苦しみを感じた。

参考資料

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5