0

Railsのattr_accessorのセッターメソッドがあります

 # setter method of the shopify_p accessor
 def shopify_v=(s)
   begin
     self.product.shop.connect_to_store
     @shopify_v = s if s.save
   ensure
     ShopifyAPI::Base.site = nil
   end
 end

保存が成功した場合はtrueを返し、保存アクションが機能しない場合はfalseを返します。

代わりに、常にsオブジェクトを出力します(または@shopify_v、わかりません)。

保存アクションに応じてtrueまたはfalseを返すにはどうすればよいですか?

ありがとう、アウグスト

更新#1

これが同じattr_accessorのgetterメソッドです。基本的に、これまでに行ったことがない場合にのみ、サーバーからオブジェクトをダウンロードします。

      # getter method of the shopify_v accessor
      def shopify_v
       if @shopify_v.nil?
         begin
           self.product.shop.connect_to_store
           @shopify_v = ShopifyAPI::Variant.find(self.shopify_id)
         ensure
           ShopifyAPI::Base.site = nil
         end
         puts "remote"
         return @shopify_v
       else
         puts "local"
         return @shopify_v
       end
      end
4

3 に答える 3

3
def shopify_v=(s)
  begin
    self.product.shop.connect_to_store
    @shopify_v = s if s.save
  ensure
    ShopifyAPI::Base.site = nil
  end
  @shopify_v.present? # will return true or false
end
于 2012-12-12T14:50:41.477 に答える
1

セッターは、何を返そうとしても、常に設定されている値を返します。したがって、別のメソッド名を使用する必要があります。次に例を示します。

def set_shopify_v(s)
  self.product.shop.connect_to_store
  status = s.save
  @shopify_v = s if status
  status
rescue => exc
  # Rails.logger.error(...) 
  false
ensure
  ShopifyAPI::Base.site = nil
end
于 2012-12-12T15:01:41.813 に答える
1

保存できないのは例外的な条件なので、例外を使用します。また、実用的な場合は常に、メソッドに副作用があるか、値を返す必要があります

例えば:

class ShopifyError < StandardError ; end

def shopify_v=(s)
   begin
     self.product.shop.connect_to_store
     raise ShopifyError unless s.save
     @shopify_v = s
   ensure
     ShopifyAPI::Base.site = nil
   end
 end

発信者の場合:

begin
    ...
    model.v = s
    ...
rescue ShopifyError
    # set flash[:notify], or whatever error handling is appropriate
end

また、ゲッターを構造化するためのよりクリーンな方法があります。次のようなことを検討してください。

  # getter method of the shopify_v accessor
  def shopify_v
    @shopify_v ||= fetch_v
  end

  private

  def fetch_v
     begin
       self.product.shop.connect_to_store
       ShopifyAPI::Variant.find(self.shopify_id)
     ensure
       ShopifyAPI::Base.site = nil
     end
  end
于 2012-12-15T11:30:49.617 に答える