rue*_*ghn 7 ruby oop model-view-controller ruby-on-rails
在我的Rails应用程序中,创建业务时我有一个包含以下字段的表单:
<%= check_box_tag(:default_company) %>
<%= label_tag(:default_company, "Set Company as Default") %>
Run Code Online (Sandbox Code Playgroud)
基本上当我创建一个企业时,如果他们选中此框,我需要它来运行类似下面的代码:
def set_default_company(company, user)
exists = DefaultCompany.find(user.id)
if exists
exists.update_attributes(company: company)
else
DefaultCompany.create(company: company, user: user)
end
end
Run Code Online (Sandbox Code Playgroud)
在学习的过程中,我通常会在我的控制器中执行这些操作,但我正在尝试遵循最佳实践并使用胖模型,瘦控制器,所以我想要使用这样的逻辑:
def create
@company = Company.new(params[:company])
if @company.save
if params[:default_company]
Company.set_default_company(@company.id, current_user.id,)
end
flash[:notice] = "Company was successfully created."
redirect_to @company
else
redirect_to new_company_path
end
end
Run Code Online (Sandbox Code Playgroud)
这是我对是否使用类方法或实例方法进行调用感到困惑的地方set_default_company.他们似乎都会工作,我看不到其中任何一方的好处.
除了向我提供有关使用哪种方法的任何信息之外,如果有人可以向我展示一个简短的写作实现,作为类方法与实例方法,它可以让我更好地理解为什么.
这是我写它们的方式:
def self.set_default_company(company, user)
# Logic here
end
def set_default_company(company, user)
# Logic here
end
Run Code Online (Sandbox Code Playgroud)
以这种方式写它我也看不到任何好处.
mik*_*kej 16
顾名思义,模型上的实例方法应该用于与用户的特定实例(调用该方法的实例)相关的逻辑/操作.因此,您可以考虑将用户的默认公司设置为一个实例方法User.类方法适用于不在模型的单个实例上运行的事物,或者您没有可用实例的情况.例如,您可能有一个类方法来整理您的数据库,例如User.purge_expired_users不适用于单个用户对象的数据库.
例如
class User
def set_default_company(company)
exists = DefaultCompany.find(self.id)
if exists
exists.update_attributes(company: company)
else
DefaultCompany.create(company: company, user: self)
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后你的控制器方法看起来像:
def create
@company = Company.new(params[:company])
if @company.save
if params[:default_company]
current_user.set_default_company @company
end
flash[:notice] = "Company was successfully created."
redirect_to @company
else
redirect_to new_company_path
end
end
Run Code Online (Sandbox Code Playgroud)
或者,您可以从其他角度考虑关系,并将实例方法放在Company例如company.set_as_default_for(user).