Railsã®DBã®CRUDæ“作を簡å˜ã«å®Ÿè£…ã™ã‚‹ãŸã‚ã®ãƒ©ã‚¤ãƒ–ラリ。 ä¸€è¦§ã®æ¤œç´¢ã€ã‚½ãƒ¼ãƒˆã€ãƒšãƒ¼ã‚¸ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚„å„アクションã®èªå¯æ©Ÿèƒ½ã‚‚å‚™ãˆã‚‹ã€‚
事å‰ã«yarnを実行ã§ãる環境を構築ã—ã¦ãŠãã“ã¨ã€‚
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.10/install.sh | bash
※nvmã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã¯æœ€æ–°ã®æƒ…å ±ã‚’ã‚µã‚¤ãƒˆã§ç¢ºèª
nvm install --lts
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update
sudo apt-get install --no-install-recommends yarn
※yarnã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã¯æœ€æ–°ã®æƒ…å ±ã‚’ã‚µã‚¤ãƒˆã§ç¢ºèª
git clone git@bitbucket.org:aselab/crud.git
cd crud
bundle install
cd spec/dummy
bin/yarn install
bin/rails db:migrate
bin/rails s
crudã¯ä»Šã®ã¨ã“ã‚ vendor/gems/crud ã«ç½®ãã“ã¨ã‚’剿ã¨ã™ã‚‹ã€‚ Webpacker㨠Bootstrap 4 ãŒå‰æãªã®ã§åˆ¥é€”インストールã—ã¦ãŠã。
git submoduleã§é‹ç”¨ã™ã‚‹å ´åˆ
git submodule add git@bitbucket.org:aselab/crud.git vendor/gems/crud
git submodule update --init
# 特定ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’使ã„ãŸã„å ´åˆã¯submoduleã«ç§»å‹•ã—ã¦checkoutã™ã‚‹
ファイルã ã‘è¿½åŠ ã™ã‚‹å ´åˆ
mkdir -p vendor/gems/crud
git archive --remote=git@bitbucket.org:aselab/crud.git [master or ãƒãƒ¼ã‚¸ãƒ§ãƒ³æŒ‡å®šãªã©] | tar -x -C vendor/gems/crud
以下をGemfileã«è¿½åŠ ã—ã¦bundle install
gem 'crud', path: 'vendor/gems/crud'
# API modeã®å ´åˆã¯ã“ã¡ã‚‰ã€ä»¥é™ã®è¨å®šã¯ä¸è¦
gem 'crud_api', path: 'vendor/gems/crud'
yarnã§ãƒ‘ッケージ追åŠ
bin/yarn add vendor/gems/crud/webpacker
bin/yarn add @fortawesome/fontawesome @fortawesome/fontawesome-free-solid
# 以下ã¯inputsã‚’ä½¿ã†æ™‚ã«å¿…è¦ãªã‚‚ã®ã ã‘
bin/yarn add select2 select2-bootstrap4-theme
Webpackerã®ã‚¨ãƒ³ãƒˆãƒªãƒ¼ãƒã‚¤ãƒ³ãƒˆã«å«ã‚ã‚‹ app/javascript/packs/application.js
import 'crud'
import 'crud/fontawesome'
import 'crud/coreui'
// inputsã¯ä½¿ã†ã‚‚ã®ã ã‘を個別ã«importã—ã¦ã‚‚よã„
import 'crud/inputs'
layoutãªã©ã«bootstrap_flash_messagesを追åŠ
config/initializers/crud.rb ã«ä»¥ä¸‹ã®ã‚ˆã†ã«æ›¸ã
Crud.configure do |config|
# https://github.com/plataformatec/simple_form/pull/1553 を利用ã™ã‚‹ã‹ã©ã†ã‹
config.simple_form.use_valid_class = false
config.icon.search = "fas fa-search"
end
è¨å®šå€¤ã¯ lib/crud/config.rb ã‚’å‚照。
モデルã®CRUD機能をæä¾›ã™ã‚‹ã‚³ãƒ³ 8000 トãƒãƒ¼ãƒ©ã®åŸºåº•クラス。 Rails標準ã®RESTful routesã«å‰‡ã£ãŸã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’æä¾›ã™ã‚‹ã€‚
アクションå | 内容 |
---|---|
index | 一覧表示 |
show | 詳細表示 |
new | æ–°è¦ä½œæˆç”»é¢è¡¨ç¤º |
edit | 編集画é¢è¡¨ç¤º |
create | æ–°è¦ä½œæˆå‡¦ç† |
update | æ›´æ–°å‡¦ç† |
destroy | å‰Šé™¤å‡¦ç† |
ãれãžã‚Œã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ãŒå®Ÿè¡Œã•れる時ã«ã€set_defaults, before_(アクションå), do_(アクションå) メソッドãŒå‘¼ã³å‡ºã•れる仕様ã«ãªã£ã¦ã„る。 何も実装ã—ãªãã¦ã‚‚デフォルトルールã«å¾“ã£ã¦å‹•作ã™ã‚‹ã‚ˆã†ã«ä½œã‚‰ã‚Œã¦ãŠã‚Šã€å‹•作をカスタマイズã—ãŸã„å ´åˆã ã‘protectedã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’定義ã—ãŸã‚Šã€ å„メソッドをオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã—ã¦å®Ÿè£…ã™ã‚Œã°ã‚ˆã„。 最å°ã®ã‚³ãƒ¼ãƒ‰ä¾‹:
class UsersController < Crud::ApplicationController
permit_keys :name, :age
end
indexアクションã«ã¤ã„ã¦ã¯æä¾›ã™ã‚‹æ©Ÿèƒ½ãŒå¤šã„ã®ã§ã€do_index内ã§ä»¥ä¸‹ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã—ã¦ãŠã‚Šã€å€‹åˆ¥ã«ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã§ãるよã†ã«ã—ã¦ã„る。
メソッドå | 機能 | ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå‡¦ç† |
---|---|---|
do_filter | ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼å‡¦ç† | params[:except_ids]を除外 |
do_query | æ¤œç´¢ã‚½ãƒ¼ãƒˆå‡¦ç† | ã‚ーワード検索, 詳細検索, ソートã®é …ã‚’å‚ç…§ |
do_page | ページãƒãƒ¼ã‚·ãƒ§ãƒ³ | params[:per] (デフォルト25)件毎ã®params[:page]ページ目を検索 |
crudã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©ã«å¯¾å¿œã™ã‚‹ãƒ¢ãƒ‡ãƒ«ã¯model, indexアクションã§è¡¨ç¤ºã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã¯resourcesã€ãã®ä»–ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã§æ‰±ã†ãƒ‡ãƒ¼ã‚¿ã¯resourceを利用ã™ã‚‹ã€‚ ã“れらã¯helperメソッドã¨ã—ã¦å®šç¾©ã—ã¦ã„ã‚‹ãŸã‚ã€controllers, helpers, viewsã©ã“ã§ã‚‚使ãˆã‚‹ã‚ˆã†ã«ãªã£ã¦ã„る。
デフォルトã§ã¯modelã¯ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©åã‹ã‚‰è§£æ±ºã•れる。例ãˆã°UsersControllerãªã‚‰ã°Userモデルを扱ã†ã€‚ 命åè¦ç´„ã«åã™ã‚‹ãƒ¢ãƒ‡ãƒ«ã‚’扱ã„ãŸã„å ´åˆã¯ãƒ¡ã‚½ãƒƒãƒ‰ã‚’オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã—ã¦æ˜Žç¤ºçš„ã«æŒ‡å®šã™ã‚‹ã€‚
resourcesã«ã¯ãƒ‡ãƒ•ォルトã§ã¯model.allãŒè¨å®šã•れã¦ã„る。 例ãˆã°æ¤œç´¢å¯¾è±¡ã‚’モデル全体ã§ã¯ãªã特定ã®ç¯„囲ã«çµžã‚Šè¾¼ã¿ãŸã„å ´åˆãªã©ã¯ã€do_filterメソッドをオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã—ã¦çµžã‚Šè¾¼ã‚“ã çµæžœã‚’è¿”ã™ã‚ˆã†ã«å®Ÿè£…ã™ã‚‹ã€‚ resourceã«ã¯model.find(params[:id])ã®çµæžœãŒè¨å®šã•れã¦ã„る。
class FoosController < Crud::ApplicationController
protected
# デフォルトã§ã¯Fooãƒ¢ãƒ‡ãƒ«ãŒæ‰±ã‚れるãŒã€åˆ¥ã®ãƒ¢ãƒ‡ãƒ«ã‚’扱ã„ãŸã„å ´åˆã¯å®šç¾©
def model
User
end
# ä¸€è¦§ã§æ‰±ã†å¯¾è±¡ã‚’特定ã®scopeã«çµžã‚Šè¾¼ã¿ãŸã„å ´åˆ
def do_filter
resources.active unless params[:all]
end
# è«–ç†å‰Šé™¤ã«ã—ãŸã„
def do_destroy
resource.update_attribute(:deleted_at, DateTime.now)
end
end
params[:term]ã®å€¤ã§å„カラムをORæ¡ä»¶ã§æ¤œç´¢ã™ã‚‹ã€‚ デフォルトã§ã¯æ–‡å—åˆ—ã€æ•°å€¤åž‹ã€åˆ—挙型ã®ä¸€è¦§è¡¨ç¤ºã‚«ãƒ©ãƒ を検索ã™ã‚‹ã€‚ æ–‡å—列ã¯like検索ã€ãã®ä»–ã¯å®Œå…¨ä¸€è‡´ã§æ¤œç´¢ã™ã‚‹ã€‚ ActiveRecordã®å ´åˆã¯é–¢é€£ã®æ¤œç´¢ã‚‚サãƒãƒ¼ãƒˆã—ã¦ã„ã‚‹ã€‚è©³ç´°ã¯æ¤œç´¢æ¡ä»¶ã®æŒ‡å®šã‚’å‚照。
params[:operator]ã¾ãŸã¯params[:op]ã§å„ã‚«ãƒ©ãƒ ã®æ¤œç´¢æ–¹æ³•を〠params[:value]ã¾ãŸã¯params[:v]ã¾ãŸã¯params直下ã§å„ã‚«ãƒ©ãƒ ã®æ¤œç´¢å€¤ã‚’指定ã™ã‚‹ã€‚
オペレータå | 別å | æ¤œç´¢å€¤ã®æ•° |
---|---|---|
equals | = | 1 |
not_equals | != | 1 |
contains | ~ | 1 |
not_contains | !~ | 1 |
any_of | in | * |
greater_or_equal | >= | 1 |
less_or_equal | <= | 1 |
between | <> | 2 |
any | * | 0 |
none | !* | 0 |
operatorを指定ã—ãªã„å ´åˆã®ãƒ‡ãƒ•ォルトã¯equalsã§ã‚る。
# nameã«userãŒå«ã¾ã‚Œã‚‹usersを検索
/users?operator[name]=contains&value[name]=user
# ageãŒ20ã‹ã‚‰30ã®usersを検索
/users?op[age]=between&v[age][]=20&v[age][]=30
# name: user1, age: 18ã®usersを検索
/users?name=user1&age=18
params[:sort_key]ã«ã‚«ãƒ©ãƒ åã‚’ã€params[:sort_order]ã«ã‚½ãƒ¼ãƒˆé †(asc, desc)を指定ã™ã‚‹ã€‚ ã‚½ãƒ¼ãƒˆé †ã‚’æŒ‡å®šã—ãªã„å ´åˆã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã¯æ˜‡é †ã§ã‚る。
permit_keysã§æ›´æ–°å¯¾è±¡ã®ã‚«ãƒ©ãƒ を指定ã™ã‚‹ã€‚StrongParametersã¨åŒæ§˜ã®æŒ‡å®šæ–¹æ³•。 全アクション共通ã®å¯¾è±¡ã‚«ãƒ©ãƒ ã¯model_columnsメソッドã§å®šç¾©ã™ã‚‹ã€‚デフォルトã¯permit_keysã¨åŒã˜ã€‚ å„アクション毎ã®å¯¾è±¡ã‚«ãƒ©ãƒ ã¯columns_for_(index, show, create, update)ã§å®šç¾©ã™ã‚‹ã€‚デフォルトã¯model_columnsã¨åŒã˜ã€‚ 一覧表示ã®å„フォーマット毎ã®å‡ºåŠ›å¯¾è±¡ã‚«ãƒ©ãƒ ã¯columns_for_(MIMEタイプ)ã§å®šç¾©ã™ã‚‹ã€‚デフォルトã¯columns_for_indexã¨åŒã˜ã€‚ 検索対象カラムã¯columns_for_searchã§å®šç¾©ã™ã‚‹ã€‚デフォルトã¯columns_for_indexã®ã†ã¡æ–‡å—åˆ—ã€æ•°å€¤åž‹ã€åˆ—挙型ã®ã‚«ãƒ©ãƒ 。 詳細検索対象ã®ã‚«ãƒ©ãƒ ã¯columns_for_advanced_searchã§å®šç¾©ã™ã‚‹ã€‚デフォルトã¯columns_for_indexã¨åŒã˜ã€‚
class FoosController < Crud::ApplicationController
permit_keys :column1, :column2, array_column: [], hash_column: [:nested_column1, :nested_column2]
protected
def model_columns
[:column1, :column2]
end
# 一覧画é¢ã®è¡¨ç¤ºé …ç›®
def columns_for_index
[:column1, :virtual_column]
end
# æ–°è¦ä½œæˆç”»é¢ã®è¡¨ç¤ºé …ç›®
def columns_for_create
[:column1]
end
# CSV出力時ã®é …ç›®
def columns_for_csv
model_columns
end
# 検索対象ã®ã‚«ãƒ©ãƒ
def columns_for_search
[:column1]
end
# 詳細検索対象ã®ã‚«ãƒ©ãƒ
def columns_for_advanced_search
[:column1]
end
end
index_actionsメソッドã§ä¸€è¦§ç”»é¢ã®å„行ã”ã¨ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’定義ã§ãる。デフォルトã¯:show, :edit, :destroy
å„アクションã®ãƒªãƒ³ã‚¯è¡¨ç¤ºã‚’変更ã—ãŸã„å ´åˆã€ä»¥ä¸‹ã®å„ªå…ˆé †ã§ãƒ¡ã‚½ãƒƒãƒ‰ã‚’定義ã—ã¦ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã§ãる。
- helperã« #{controller_name}link_to#{action} ã¨ã„ã†åå‰ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’実装
- helperã« link_to_#{action} ã¨ã„ã†åå‰ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’実装
- helperã« #{controller_name}link_to#{action}_options ã¨ã„ã†åå‰ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’実装
- helperã« link_to_#{action}_options ã¨ã„ã†åå‰ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’実装
一覧や詳細画é¢ã§è¡¨ç¤ºã•れるカラムã®å†…容ã¯ã€ãƒ‡ãƒ•ォルトã§ã¯simple_formatã§å‡ºåŠ›ã•れる。 以下ã®å„ªå…ˆé †ã§ãƒ¡ã‚½ãƒƒãƒ‰ã‚’定義ã—ã¦è¡¨ç¤ºå†…容をカスタマイズã™ã‚‹ã“ã¨ãŒã§ãる。
- helperã« #{controller_name}_#{column_name}_html ã¨ã„ã†åå‰ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’実装
- helperã« #{column_name}_html ã¨ã„ã†åå‰ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’実装
- modelã« #{column_name}_label ã¨ã„ã†åå‰ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’実装
module UsersHelper
def users_name_html(resource, value)
link_to value, resource
end
end
resourceã«ã¯ãƒ¢ãƒ‡ãƒ«ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãŒã€valueã«ã¯ãã®ã‚«ãƒ©ãƒ ã«å¯¾å¿œã™ã‚‹å€¤ãŒæ¸¡ã•れる。 ã“ã®ä¾‹ã®å ´åˆ resource: Userインスタンス, value: nameã®å€¤
# helperã«å®Ÿè£…
module UsersHelper
def users_birth_date_html(resource, value)
value.try(:strftime, "%Y/%m/%d")
end
end
# modelã«å®Ÿè£…
class User < ApplicationRecord
def birth_date_label
birth_date.try(:strftime, "%Y/%m/%d")
end
end
編集画é¢ã§è¡¨ç¤ºã•れるカラムã®å†…容ã¯ã€ãƒ‡ãƒ•ォルトã¯simple_formã¨åŒã˜ã ãŒã€æ—¥ä»˜åž‹ã¯ãƒ”ッカーã§è¡¨ç¤ºã•れる。 以下ã®å„ªå…ˆé †ã§helperメソッドを定義ã—ã¦å…¥åŠ›ãƒ•ã‚©ãƒ¼ãƒ ã‚’ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã™ã‚‹ã“ã¨ãŒã§ãる。
- #{controller_name}_#{column_name}_input ã¨ã„ã†åå‰ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’実装
- #{column_name}_input ã¨ã„ã†åå‰ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’実装
- #{controller_name}_#{column_name}_input_options ã¨ã„ã†åå‰ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’実装
- #{column_name}_input_options ã¨ã„ã†åå‰ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’実装
module UsersHelper
def users_sex_input_options
{ as: :select, collection: [:male, :female] }
end
end
simple_formã®inputã«æ¸¡ã™ã‚ªãƒ—ション値を返ã™ã‚ˆã†ã«å®Ÿè£…ã™ã‚‹ã€‚
module UsersHelper
def users_column1_input(f)
content_tag(:div) do
f.text_field(:column1) + javascript_tag("...")
end
end
end
- :bootstrap_datepicker
- :bootstrap_timepicker
- :bootstrap_datetimepicker
- :bootstrap_filestyle
- :select2
デフォルトã§ã¯ä¸€è¦§ã«è¡¨ç¤ºã•れã¦ã„ã‚‹æ–‡å—列ã¾ãŸã¯æ•°å€¤ã€åˆ—挙型ã®ã‚«ãƒ©ãƒ ãŒæ¤œç´¢å¯¾è±¡ã¨ãªã‚‹ã€‚ 検索対象ã®ã‚«ãƒ©ãƒ を変更ã—ãŸã„å ´åˆã¯ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©ã«columns_for_searchメソッドを定義ã™ã‚‹ã€‚
デフォルトã§ã¯æ–‡å—列カラムã¯like検索ã€ãれ以外ã¯å®Œå…¨ä¸€è‡´ã§æ¤œç´¢ã•れる。 検索æ¡ä»¶ã‚’変更ã—ãŸã„å ´åˆã‚„ã€DBã«å˜åœ¨ã—ãªã„ä»®æƒ³ã‚«ãƒ©ãƒ ã«æ¤œç´¢æ¡ä»¶ã‚’æŒãŸã›ã‚‹å ´åˆãªã©ã«ã¯ã€ search_by_#{column_name} ã¨ã„ã†ãƒ¡ã‚½ãƒƒãƒ‰ã‚’ã‚ 8000 ³ãƒ³ãƒˆãƒãƒ¼ãƒ©ã«å®šç¾©ã™ã‚‹ã€‚ 引数ã«ã¯æ¤œç´¢ã‚ãƒ¼ãƒ¯ãƒ¼ãƒ‰ãŒæ¸¡ã•れるã®ã§ã€ãれを使ã£ã¦æ¤œç´¢æ¡ä»¶ã‚’è¿”ã™ã‚ˆã†ã«å®Ÿè£…ã™ã‚Œã°ã‚ˆã„。 ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’定義ã›ãšã€å¾Œè¿°ã®è©³ç´°æ¤œç´¢ç”¨ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’定義ã™ã‚‹ã ã‘ã§ã‚‚よã„。
class User < ApplicationRecord
def full_name
"#{last_name} #{first_name}"
end
end
class UsersController < Crud::ApplicationController
protected
def columns_for_search
[:full_name, :email]
end
def search_by_full_name(term)
["last_name LIKE :term OR first_name LIKE :term", term: "%#{term}%"]
end
end
ActiveRecordã®å ´åˆã¯é–¢é€£ã‚‚検索ã§ãる。 関連モデルã®search_fieldã¨ã„ã†åå‰ã®ã‚¯ãƒ©ã‚¹ãƒ¡ã‚½ãƒƒãƒ‰ã‚’定義ã™ã‚‹ã¨ã€ 関連テーブルをjoinã—ã¦ãã®ã‚«ãƒ©ãƒ åã§æ¤œç´¢ã™ã‚‹ã€‚ search_fieldを指定ã—ãªã„å ´åˆã¯ã€ãƒ‡ãƒ•ォルトã§nameã¾ãŸã¯titleã¨ã„ã†ã‚«ãƒ©ãƒ ãŒç”¨ã„られる。
検索対象ã®ã‚«ãƒ©ãƒ を変更ã—ãŸã„å ´åˆã¯ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©ã«columns_for_advanced_searchメソッドを定義ã™ã‚‹ã€‚
検索処ç†ã‚’変更ã—ãŸã„å ´åˆã¯ã€advanced_search_by_#{column_name} ã¨ã„ã†ãƒ¡ã‚½ãƒƒãƒ‰ã‚’コントãƒãƒ¼ãƒ©ã«å®šç¾©ã™ã‚‹ã‹ã€ モデルã®ã‚¯ãƒ©ã‚¹ãƒ¡ã‚½ãƒƒãƒ‰ã¨ã—ã¦å®šç¾©ã™ã‚‹ã€‚ 引数ã«ã¯operatorã¨æ¤œç´¢å€¤ãŒæ¸¡ã•れる。検索値ã®å€‹æ•°ã¯å¯å¤‰ãªã®ã§ã€å¯å¤‰é•·å¼•æ•°ã§å®šç¾©ã™ã‚‹ã¨ã‚ˆã„。
実装例㯠spec/dummy/app/models/ar/user.rb ã‚’å‚照。
詳細検索フォームを変更ã—ãŸã„å ´åˆã¯ã€ä»¥ä¸‹ã®å„ªå…ˆé †ã§helperメソッドを定義ã—ã¦ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã™ã‚‹ã“ã¨ãŒã§ãる。
- #{controller_name}_#{column_name}_search_input
- #{column_name}_search_input
- #{controller_name}_#{column_name}_search_input_options
- #{column_name}_search_input_options
- #{controller_name}_#{column_name}_input_options
- #{column_name}_input_options
search_inputメソッドã®å¼•æ•°ã«ã¯simple_form_forã®builder, operator, æ¤œç´¢å€¤ãŒæ¸¡ã•れる。検索値ã®å€‹æ•°ã¯å¯å¤‰ãªã®ã§ã€å¯å¤‰é•·å¼•æ•°ã§å®šç¾©ã™ã‚‹ã€‚ search_input_optionsã¨input_optionsメソッドã¯å¼•æ•°ãªã—ã§ã€input_optionsメソッドã¯ç·¨é›†ãƒ•ォームã§ã‚‚使ã‚れる。
詳細検索ã®ã‚ªãƒšãƒ¬ãƒ¼ã‚¿ã‚’変更ã—ãŸã„å ´åˆã¯ã€ä»¥ä¸‹ã®å„ªå…ˆé †ã§helperメソッドを定義ã—ã¦ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã™ã‚‹ã“ã¨ãŒã§ãる。
- #{controller_name}_#{column_name}_search_operator_options
- #{column_name}_search_operator_options
詳細検索フォームカスタマイズã®å®Ÿè£…例㯠spec/dummy/app/helpers/users_helper.rb ã‚’å‚照。
デフォルトã®ã‚½ãƒ¼ãƒˆæ¡ä»¶ã‚„ページãƒãƒ¼ã‚·ãƒ§ãƒ³ä»¶æ•°ã‚’指定ã™ã‚‹ã“ã¨ãŒã§ãる。 ページãƒãƒ¼ã‚·ãƒ§ãƒ³ä»¶æ•°ã¯ãƒ‡ãƒ•ォルト25件。
class SampleController < Crud::ApplicationController
default_sort_key :name
default_sort_order :desc
default_paginates_per 10
end
カラム毎ã«ã‚½ãƒ¼ãƒˆæ¡ä»¶ã‚’カスタマイズã—ãŸã„å ´åˆã€sort_by_#{column_name} ã¨ã„ã†ãƒ¡ã‚½ãƒƒãƒ‰ã‚’コントãƒãƒ¼ãƒ©ã«å®šç¾©ã™ã‚‹ã€‚ 引数ã«ã¯:ascã¾ãŸã¯:descãŒæ¸¡ã•れるã®ã§ã€ãれを使ã£ã¦ã‚½ãƒ¼ãƒˆæ¡ä»¶ã‚’è¿”ã™ã‚ˆã†ã«å®Ÿè£…ã™ã‚Œã°ã‚ˆã„。
class UsersController < Crud::ApplicationController
protected
def sort_by_full_name(order)
"last_name #{order}, first_name #{order}"
end
end
権é™åˆ¶å¾¡ã‚’ã—ãŸã„å ´åˆã¯app/authorizationsã«ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©ã¨åŒåã®Authorizationクラスを定義ã™ã‚‹ã€‚ å„アクションã®å®Ÿè¡Œã‚’許å¯ã™ã‚‹ã‹ã©ã†ã‹ã‚’メソッド定義ã—ã¦true/falseã‚’è¿”ã™ã‚ˆã†ã«å®Ÿè£…ã™ã‚Œã°ã‚ˆã„。
特殊ãªã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¨ã—ã¦ã€manageを定義ã™ã‚‹ã¨create, update, destroyã®æ¨©é™ã‚’ã¾ã¨ã‚ã¦åˆ¶å¾¡ã§ãる。 アクションã«å¯¾å¿œã™ã‚‹ãƒ¡ã‚½ãƒƒãƒ‰ã‚’定義ã—ãªã„å ´åˆã®ãƒ‡ãƒ•ォルト値ã¯trueã§ã‚る。
# 暗黙的ã«UsersControllerã§ç”¨ã„られる
class UsersAuthorization < Crud::Authorization::Default
def create?(user)
false
end
def manage?(user)
user == current_user
end
end
メソッドã®å¼•æ•°ã«ã¯ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行ã—よã†ã¨ã—ã¦ã„る対象ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ãŒæ¸¡ã•れる。 ã¾ãŸã€ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©ã®current_userãŒæ¸¡ã•れるãŸã‚ã€ãƒã‚°ã‚¤ãƒ³ãƒ¦ãƒ¼ã‚¶ã«ã‚ˆã‚‹åˆ¶å¾¡ã‚‚å¯èƒ½ã€‚
コントãƒãƒ¼ãƒ©ã«Authorizationã¨ã„ã†åå‰ã®ã‚¤ãƒ³ãƒŠãƒ¼ã‚¯ãƒ©ã‚¹ã‚’定義ã—ã¦ã‚‚よã„。
class UsersController < Crud::ApplicationController
class Authorization < Crud::Authorization::Default
def create?(user)
false
end
def manage?(user)
user == current_user
end
end
end
ãƒªã‚½ãƒ¼ã‚¹æ¯Žã«æ¨©é™ã‚’ç´°ã‹ãè¨å®šã—ãŸã„å ´åˆã«ä½¿ã†ãƒ©ã‚¤ãƒ–ラリ。
rails generate permissible:install
権é™åˆ¶å¾¡ã—ãŸã„モデルã”ã¨ã«ä»»æ„ã®ãƒãƒ¼ãƒ«åã¨å€¤ã‚’ビットã§å®šç¾©ã—ã€åŒ…å«é–¢ä¿‚を作るã“ã¨ãŒã§ãる。
class Article < ApplicationRecord
acts_as_permissible(admin: 0b111, write: 0b011, read: 0b001, default: 0b001)
end
上記ã®å ´åˆã€write権é™ã‚’æŒã¤ãƒãƒ¼ãƒ«ã¯admin, writeã§ã€read権é™ã‚’æŒã¤ãƒãƒ¼ãƒ«ã¯admin, write, readã«ãªã‚‹ã€‚
TODO
çµæžœã®ãƒ•ォーマットã¯html, js, jsonã«å¯¾å¿œã€‚indexã®ã¿csvã«ã‚‚対応。 htmlã¨jsã¯views/crud/applicationã®ãƒ†ãƒ³ãƒ—レートãŒç”¨ã„られるãŸã‚ã€ã“れをcontrollerã«å¯¾å¿œã™ã‚‹viewã¨ã—ã¦ã‚³ãƒ”ーã—ã¦ç·¨é›†ã™ã‚Œã°ã‚ˆã„。 jsonã¯active_model_serializersを用ã„ã¦å‡ºåŠ›ã•れる。 app/serializersã«ãƒ¢ãƒ‡ãƒ«ã«å¯¾å¿œã™ã‚‹ã‚·ãƒªã‚¢ãƒ©ã‚¤ã‚¶ãƒ¼ã‚’定義ã™ã‚Œã°ãれãŒç”¨ã„られる。
特定ã®ãƒ•ォーマットã®å‹•ä½œè‡ªä½“ã‚’æ›¸ãæ›ãˆãŸã„å ´åˆã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã—ã¦superã«ãƒ–ãƒãƒƒã‚¯ã‚’渡ã™ã“ã¨ãŒã§ãる。
def create
super do |format|
format.html { ... }
end
end
編集画é¢ã®ã‚ャンセルã€ä½œæˆ/更新時ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆå…ˆã‚’変更ã—ãŸã„å ´åˆã€cancel_pathをオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ã¨ã‚ˆã„。デフォルトã§ã¯ä¸€è¦§ç”»é¢ã«æˆ»ã‚‹ã€‚ 削除時ã¯request.refererã«æˆ»ã‚‹ã€‚
# モデル + crudコントãƒãƒ¼ãƒ©ç”Ÿæˆ
rails generate crud:scaffold User group:references name age:integer
# crudコントãƒãƒ¼ãƒ©ç”Ÿæˆ
rails generate crud:controller Users group_id name age
# crudã®viewã‚’app/views/crud/applicationã«ã‚³ãƒ”ー
rails generate crud:application_views
# crudã®viewをコントãƒãƒ¼ãƒ©å˜ä½ã§ã‚³ãƒ”ー
rails generate crud:views users
include Crud::ModalPickerController
f.input as: :modal_picker, url: picker_controllers_path
TODO
include Crud::Wizard
TODO