[解決済み] Rails 4で懸念事項を使用する方法
質問
Rails 4のデフォルトのプロジェクトジェネレータでは、コントローラとモデルの下に"consitutions"というディレクトリが作成されるようになっています。ルーティングの懸念事項の使用方法についてはいくつか説明がありましたが、コントローラやモデルについては何も書かれていません。
現在のDCIのトレンドと関係があるのは間違いないと思いますので、試してみたいと思います。
問題は、この機能をどのように使用すればよいかということです。この機能を動作させるために、ネーミングやクラス階層をどのように定義すればよいかという規約があるのでしょうか?また、モデルやコントローラの中にどのように懸念を含めることができるでしょうか?
どのように解決するのですか?
そこで、自分で調べてみました。実は、とてもシンプルで強力なコンセプトなのです。それは、以下の例のように、コードの再利用に関係しています。基本的に、このアイデアは、モデルをクリーンアップするために、コードの共通および/またはコンテキスト固有のチャンクを抽出し、それらがあまりにも太く、乱雑になるのを避けることである。
例として、よく知られたパターンのひとつであるタグ付け可能なパターンを紹介しよう。
# app/models/product.rb
class Product
include Taggable
...
end
# app/models/concerns/taggable.rb
# notice that the file name has to match the module name
# (applying Rails conventions for autoloading)
module Taggable
extend ActiveSupport::Concern
included do
has_many :taggings, as: :taggable
has_many :tags, through: :taggings
class_attribute :tag_limit
end
def tags_string
tags.map(&:name).join(', ')
end
def tags_string=(tag_string)
tag_names = tag_string.to_s.split(', ')
tag_names.each do |tag_name|
tags.build(name: tag_name)
end
end
# methods defined here are going to extend the class, not the instance of it
module ClassMethods
def tag_limit(value)
self.tag_limit_value = value
end
end
end
つまり、Productのサンプルに倣って、任意のクラスにTaggableを追加し、その機能を共有することができるのです。
これは、かなりよく説明されている DHH :
Rails 4では、プログラマが懸念事項を使用するために デフォルトの app/models/concerns と app/controllers/concerns ディレクトリー これは自動的にロードパスの一部となります。また ActiveSupport::Concernラッパーは、この 軽量なファクタリング機構が輝きます。
関連
-
[解決済み】Bundler: コマンドが見つからない
-
[解決済み】取得中。「プロジェクトのクローンとマイグレート後に、「マイグレーションは保留中です。この問題を解決するには 'bin/rake db:migrate RAILS_ENV=development' を実行してください。
-
[解決済み】ActionController::InvalidAuthenticityTokenについて
-
[解決済み] ウェブパッカーがアプリケーションを見つけ出せない
-
[解決済み] Ruby on Rails の新規セットアップ : "Expected string default value for '--rc'; got false (boolean)".
-
[解決済み] 未初期化の定数 "コントローラ名"
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み】Railsの認証トークンを理解する
-
[解決済み】RailsでOOデザイン。どこにものを置くか
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ActionController::InvalidAuthenticityTokenについて
-
[解決済み] 該当するルートがない [GET] "demo/hello"
-
[解決済み] Ruby on Railsのためにnetbeansを構成する方法は?
-
[解決済み] Errno::EACCESS: パーミッションが拒否された @ dir_s_mkdir
-
[解決済み] Oauth2 Instagram API "リダイレクトURIが登録されたリダイレクトURIと一致しない"
-
[解決済み] Ruby on Railsでsimple_formを使うさまざまな方法|何が違うの?
-
[解決済み] nil:NilClass の未定義メソッド `each'... なぜ?
-
[解決済み] 属性を割り当てる場合、引数としてハッシュを渡す必要がある
-
[解決済み] Heroku Error R14 (Memory quota exceeded): How do I solve this?
-
[解決済み] Ruby on Rails の新規セットアップ : "Expected string default value for '--rc'; got false (boolean)".