0

current_userモデルで Devise のヘルパーを使用したいので、 を使用してモデルShopで通貨を保存できます。Dressbefore_save

これはうまくいきません:

# Dress model
before_save :set_currency

def set_currency
  self.currency = current_user.shop.currency
end

コントローラーで機能します:

def create
  @dress = current_user.shop.dresses.create(params[:dress])
  @dress.update_column(:currency, current_user.shop.currency)
end

UPDATEしかし、アフターを行うので効率が悪いようですCOMMIT。StackOverflow の他のユーザーはcurrent_user、モデルで使用すべきではないと述べました。current_userモデルにアクセスする他の方法はありますか?

4

3 に答える 3

1

コントローラで.createの代わりに.buildを使用して、Dressモデルの通貨属性に値を設定します。

def create
    @dress = current_user.shop.dresses.build(params[:dress])
    @dress.currency = current_user.shop.currency
    if @dress.save
       .....
    else
       .....
    end
  end
于 2012-12-18T12:17:14.570 に答える
1

1 つの方法は、ユーザーをパラメーターとしてモデル メソッドに渡し、before_save コールバックを使用しないことです。

# Dress model

def set_currency(user)
  self.currency = user.shop.currency
end

別の方法は、通貨を具体的に設定することです。通貨はドレスのフィールドであるため、現在のユーザー通貨で非表示のフィールドをフォームに配置できます。これはパラメーターとして create アクションに渡され、透過的に保存されます。

実装方法:

  # At your Dress form, in your View
  <%= f.hidden_field :currency, :value => @user.shop.currency %>

  # At your controller
  def create
      @user = current_user
  end

このように、通貨を節約するために何もする必要はありません。ドレスを作成するためにパラメーターで渡されますcurrency。これが ActiveRecord フィールドであることを確認する必要があります。

通常、特定の時点でのアプリケーションの状態に関するこの種の知識をモデルに付加することは適切ではありません。そのような行動が必要だと確信している状況に陥った場合は、立ち止まって、それが本当に意味があるかどうかを自問してください。

この例では、(アプリケーションを知らなくても) 通貨はフォームの非表示フィールドにする必要があると本当に感じています。これは、モデルが存在しなければならないものであり、実際にはフィールドであり、したがって、モデルのパラメーターとともに渡される意味。

よろしくお願いします

于 2012-12-18T12:12:32.850 に答える
1

コントローラーで設定するだけで対処することをお勧めしますが...

MVC に多少違反しても構わない場合は、次の方法があります。

# application_controller.rb
before_filter :set_current
def set_current
  User.current = current_user
end

# app/models/user.rb
cattr_accessor :current

# app/models/dress.rb
before_save :set_currency
def set_currency
  self.currency = User.current.shop.currency
end
于 2012-12-18T16:11:58.467 に答える