簡體   English   中英

定義在Rails模型中使用的函數的正確方法是什么?

[英]What is the correct way to define functions to use in a rails model?

如果我的一個模型函數做某件事很復雜,或者其邏輯具有可以在另一個模型函數中重用的部分,那么在模型內部定義第三個函數以使其成為實例方法或將其定義為類方法是否正確?

我的第一個解決方案是在模型文件中執行以下操作(例如user.rb):

#Some Function
def magic_function
  return true
end

class User < ActiveRecord::Base
  def first_function
    return magic_function
  end

  def second_function
    return 1 if magic_function
    return 0
  end
end

但是我在執行rspec測試和通過Internet瀏覽時無法對magic_function進行存根,這使我相信我所做的通常不是別人做的...有些人似乎在使用模塊,但就我而言,此功能僅在其中需要文件。 我只是將其定義為使我的代碼干燥或使其更具可讀性,但我不認為它應該是實例方法,因為我不需要從此文件外部調用它,也不必是類方法出於同樣的原因。 定義這樣的函數的正確位置在哪里?

在不知道magic_function做什么的情況下很難說,但似乎您希望它是私有的

class User < ActiveRecord::Base
  def first_function
    return magic_function
  end

  def second_function
    return 1 if magic_function
    return 0
  end

  private

  def magic_function
    return true
  end
end

這將允許您從User的其他實例方法調用magic_function ,但不能從外部調用它:

user = User.new
user.first_function  # works
user.magic_function  # NoMethodError: private method `magic_function' called

但是請注意,您仍不應僅僅因為不應該對受測系統進行存根就對magic_function存根。 應該通過公共方法對其進行隱式測試。 如果要單獨測試它,則應將其放在新的類或模塊中,並從用戶那里調出它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM