2017-09-09 10 views
0

永続化されていないデータから構築されたURLでメールビューを生成する特別なケースを処理する必要があります。Railsはto_paramに永続化されていなくても何かを返すようにします。

例:私のユーザが投稿を作成でき、それが投稿作成通知メールをトリガすると仮定して、偽の投稿作成​​の例を送信したいと思います。このために、私はFactoryGirl.build(:post)を使用して、日常のRailsの生活の中で私のPostMailer.notify_of_creation(@post)

にこれを渡しています、我々は、引数としてモデル自体を渡すことで、ルートurl_helpersを使用して、ルート・ジェネレータは自動的にするために、そのIDにモデルを変換しますarticle_path(@article)で(ルートURLの生成に使用され、ルートヘルパーは/articles/:id URLを構築するため@article.id@articleを変換します。

私はそれはActiveRecordの中に同じであると考えていますが、モデルが持続されていない場合は、とにかくMongoidで、この変換が失敗しました(これは実際のデータに対応しない可能性のあるURLの生成を防ぐのでやや良いです)

私の特定の場合、 URL生成クラッシュでそう

モデルが保持されませんよう:

ActionView::Template::Error: No route matches {:action=>"show", :controller=>"posts", :post_id=>#<Post _id: 59b3ea2aaba9cf202d4eecb6 ...

<%= post_url(@post_not_persisted) %> 

クラッシュを私はバイパスすることができます方法はあります非常に特定の範囲でのみ、この制限はありますか?そうでなければ私はresource_path(@model.id.to_s)以上@model.class.nameですべての私のresource_path(@model)を置き換えることができますが、これは右のような状況のように感じることはありません...

EDIT:

主な問題は、私は強制する必要が

Foo.new.to_param # => nil 
# whereas 
Foo.new.id.to_s # => "59b528e8aba9cf74ce5d06c0" 

ですモデルが永続化されていなくても、ID(またはその他のもの)を返すためにはto_paramを使用します。今私はスコープモンキーパッチを使用することができるかどうかを確認するために改良を見ていますが、より良いアイデアを持っている場合、私は私の洗練を使用するときに、小さな範囲の問題を持っているように見えるしかし

module ForceToParamToUseIdRefinement 
    refine Foo do 
    def to_param 
     self.class.name + 'ID' 
    end 
    end 
end 

:-)私のゲストしてくださいよurl_helpersに期待どおりにバブルアップしないためです。コンソールでのテーパリファインメントを使用してもうまく動作します(Foo.new.to_param # => 59b528e8aba9cf74ce5d06c0

答えて

0

動的メソッドオーバーライドを使用する方法が見つかりました。私は本当にそれが好きではありませんが、それは仕事を完了します。私は基本的にテスト中に使用するインスタンスをモノスケッチしています。

はそれを容易にするために、私は基本的にセッターはその後、私のコードでは、私はちょうど

を使用することができ、オブジェクト

def example_model_accessor(model_name) 
    attr_reader model_name 

    define_method(:"#{model_name}=") do |instance| 
    def instance.to_param 
     self.class.name + 'ID' 
    end 
    instance_variable_set(:"@#{model_name}", instance) 
    end 
end 

の#to_param方法にパッチを適用することをattr_accessor exceptsでのように振る舞うクラスメソッドexample_model_accessorを作成しました

class Testing 
    example_model_accessor :message 

    def generate_view_with_unpersisted_data 
    self.message = FactoryGirl.build(:message) 
    MessageMailer.created(message).deliver_now 
    end 
end 

# views/message_mailer/created.html.erb 
... 
<%= message_path(@message) %> <!-- Will work now and output "/messages/MessageID" ! --> 
関連する問題