まとめ:
respond_to
ActiveModel オブジェクト用に生成されるパスをカスタマイズするにはどうすればよいですか?
更新:回避策ではなく、これを達成するためのフック、メソッドのオーバーライド、または構成の変更を探しています。(回避策は簡単ですが、エレガントではありません。)
コンテキストと例:
以下に例を示します。Contract
多くのフィールドを持つモデルがあります。
class Contract < ActiveRecord::Base
# cumbersome, too much for a UI form
end
UI コードを扱いやすくするために、より単純なクラスを用意しましたSimpleContract
。
class SimpleContract
include ActiveModel::Model
# ...
def contract_attributes
# convert SimpleContract attributes to Contract attributes
end
def save
Contract.new(contract_attributes).save
end
end
これはうまくいきますが、コントローラーに問題があります...
class ContractsController < ApplicationController
# ...
def create
@contract = SimpleContract.new(contract_params)
flash[:notice] = "Created Contract." if @contract.save
respond_with(@contract)
end
# ...
end
問題はそれが をrespond_with
指すことですがsimple_contract_url
、代わりに を指すようにしたいです。それを行う最善の方法は何ですか?(ActiveModel を使用していることに注意してください。)contract_url
(注:Rails 4 Betaを使用していますが、それは私の問題の中心ではありません.Rails 3の良い答えもうまくいくと思います。)
サイドバー: 軽量の ActiveModel クラスでモデルをラップするこのアプローチが賢明でないと思われる場合は、コメントでお知らせください。個人的には、元のモデルをシンプルに保っているので気に入っています。「ラッパー」モデルは、いくつかの UI の詳細を処理します。これらは意図的に単純化され、適切なデフォルトが設定されています。