2016-10-06 6 views
0

ユーザモデルは、登録コントローラとパスワードコントローラを使用して更新できます。どのコントローラからの更新メソッドがモデルの中で呼び出されるかを見つける方法はありますか?モデル内に現在のコントローラ名を見つける方法はありますか?

コントローラ名をモデル内で検索したいと思います。私を助けてください。

+2

なぜ両方を区別する必要がありますか?両方の更新の違いを示すコードを投稿してください。これを処理するより良い方法があるかもしれません。 – spickermann

+0

私は電話のためのいくつかの妥当性検査をしています(存在は真です)。その場合、電話番号なしで作成されたユーザーを招待するオプションがあります。しかし、ユーザーが自分のパスワード(パスワードを忘れた)をリセットしようとすると、「電話は空にできません」というエラーが表示されます。だからこそ私はパスワードコントローラからのリクエストが来たときにだけ検証をスキップしたい。 –

+0

モデルからサービスオブジェクトにバリデーションを移すことが良い考えである理由は、完璧な例のようです。 – spickermann

答えて

4

モデルとコントローラレイヤが分離されています。モデルはコントローラ関連のものは認識していません。

コントローラの名前をモデルで取得する唯一の方法は、コントローラの名前を引数としてモデルに定義されたメソッドに渡すことです。

モデルでコントローラの名前を知っているのを実際に見たことはありません。そのような必要性IMHOはあなたが間違ったことを設計したことを意味

+0

私は電話のためのいくつかの妥当性検査をしています(存在は真です)。その場合、電話番号なしで作成されたユーザーを招待するオプションがあります。しかし、ユーザーが自分のパスワード(パスワードを忘れた)をリセットしようとすると、「電話は空にできません」というエラーが表示されます。だからこそ私はパスワードコントローラからのリクエストが来たときにだけ検証をスキップしたい。 –

1

招待されたユーザーがまだアクティブ化されていないとします。では、アクティブユーザーのみのプレゼンス検証を定義する方法はありますか?たぶん、このような何か追加して:私は、コードをテストしていませんので、それをコピーセーフではないです

validates_presence_of :phone_number, if :activated? 

を;)

0

解決策は以下のとおりです。

class User < ActiveRecord::Base 
    with_options :if => :phone_required do |user| 
     user.validates_presence_of :phone 
    end 
end 

phone_requiredので、データベースの列ですユーザーの移行を作成する必要があります。お使いのコントローラで

あなたは

your_user.phone_required = false 

または

your_user.phone_required = true 

保存する前に設定する必要があります。モデルは、コントローラの気づかなければなりませんよう

0

私は強く、このような行為を思いとどまらいますが、今

class SomeModel < ActiveRecord::Base 
    attr :controller 
end 

モデルに仮想属性を使用する場合とき、それは達成することは難しいことではありません..あなただけのコントローラに渡すことができますアップデートなど:

class SomeModelsController < ApplicationController 
    def update 
    @some_model.update_attributes(params[:some_model].merge(controller: self)) 
    end 
end 
関連する問題