0

我在rails中有一个attr_accessor的setter方法

 # 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

我会使用例外,因为无法保存是一种例外情况。此外,只要可行,方法应该要么有副作用,要么返回一个值。

例如:

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。考虑做这样的事情:

  # 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 回答
1

无论您尝试返回什么,setter总是返回正在设置的值。所以你应该使用另一个方法名,例如:

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 回答