名前空間モデルを使用して、プラットフォームにさまざまなタイプのサービスを割り当てています。
関係:Platform has_many :services
&Service belongs_to :platform
Inhéritance:、、Service::Service1 < Service
などService::Service2 < Service
。
サービスタイプごとに異なるフィールドのセットがあります(私はMongoidを使用しているため、フィールドはモデルに宣言され、「サブモデル」タイプは_type
フィールドに格納されます)。
で、私はこのServicesController::new
ような新しいサービスを開始します:
def new
klass = "service/#{params[:type]}"
@service = klass.camelize.constantize.new
render :form
end
params[:type]
ルートパラメータ(のようなもの/:platform_id/services/new/:type
)によって与えられます
私のform
見解では、サービスタイプ(Haml + simple_form)に応じてフィールドを表示できるようになりました:
= simple_form_for @service do |f|
[...]
- case @service.class
- when Service::Service1
= f.input :field1
[...]
これまではすべて正常に機能します:生成されたHTML入力は次のようになります:
<input class="string required" id="service_service1_field1" name="service_service1[field1]" size="50" type="text">
service_service1[field1]
フィールド名として、私のparamsハッシュにはサブサービスに応じて異なるキーが含まれ、コントローラーのアクションでは、コードを「乾燥」さcreate
せた状態で、サブサービスごとにケース/いつを記述する必要があります(service[field1]
インスタンス化するには、正確なモデルを含む非表示フィールドを追加する必要があります)。
名前空間モデルを使用するときに、Railsにフィールド名としてルートクラスを使用させる方法はありますか?
編集:送信ボタンi18nについての同じ質問:テキストはすべてのサービスで同じであるため、 Railsは検索しhelpers.submit.service_service1.create
たい場所を探します。helpers.submit.service.create