ユーザモデルは、登録コントローラとパスワードコントローラを使用して更新できます。どのコントローラからの更新メソッドがモデルの中で呼び出されるかを見つける方法はありますか?モデル内に現在のコントローラ名を見つける方法はありますか?
コントローラ名をモデル内で検索したいと思います。私を助けてください。
ユーザモデルは、登録コントローラとパスワードコントローラを使用して更新できます。どのコントローラからの更新メソッドがモデルの中で呼び出されるかを見つける方法はありますか?モデル内に現在のコントローラ名を見つける方法はありますか?
コントローラ名をモデル内で検索したいと思います。私を助けてください。
モデルとコントローラレイヤが分離されています。モデルはコントローラ関連のものは認識していません。
コントローラの名前をモデルで取得する唯一の方法は、コントローラの名前を引数としてモデルに定義されたメソッドに渡すことです。
モデルでコントローラの名前を知っているのを実際に見たことはありません。そのような必要性IMHOはあなたが間違ったことを設計したことを意味
私は電話のためのいくつかの妥当性検査をしています(存在は真です)。その場合、電話番号なしで作成されたユーザーを招待するオプションがあります。しかし、ユーザーが自分のパスワード(パスワードを忘れた)をリセットしようとすると、「電話は空にできません」というエラーが表示されます。だからこそ私はパスワードコントローラからのリクエストが来たときにだけ検証をスキップしたい。 –
招待されたユーザーがまだアクティブ化されていないとします。では、アクティブユーザーのみのプレゼンス検証を定義する方法はありますか?たぶん、このような何か追加して:私は、コードをテストしていませんので、それをコピーセーフではないです
validates_presence_of :phone_number, if :activated?
を;)
解決策は以下のとおりです。
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
保存する前に設定する必要があります。モデルは、コントローラの気づかなければなりませんよう
私は強く、このような行為を思いとどまらいますが、今
class SomeModel < ActiveRecord::Base
attr :controller
end
モデルに仮想属性を使用する場合とき、それは達成することは難しいことではありません..あなただけのコントローラに渡すことができますアップデートなど:
class SomeModelsController < ApplicationController
def update
@some_model.update_attributes(params[:some_model].merge(controller: self))
end
end
なぜ両方を区別する必要がありますか?両方の更新の違いを示すコードを投稿してください。これを処理するより良い方法があるかもしれません。 – spickermann
私は電話のためのいくつかの妥当性検査をしています(存在は真です)。その場合、電話番号なしで作成されたユーザーを招待するオプションがあります。しかし、ユーザーが自分のパスワード(パスワードを忘れた)をリセットしようとすると、「電話は空にできません」というエラーが表示されます。だからこそ私はパスワードコントローラからのリクエストが来たときにだけ検証をスキップしたい。 –
モデルからサービスオブジェクトにバリデーションを移すことが良い考えである理由は、完璧な例のようです。 – spickermann