我正在尝试从控制器中删除一个代码段,以使其看起来干净整洁。在我的一个控制器中,我必须使用许多条件,这使我的控制器看起来很沉重。我只想删除其他文件中的该代码块,并希望将其包括在我的控制器中。 My controller code
在这里您可以看到我正在使用一些逻辑,例如:
if search == 'Primary'
if rain_fall_type == "Agriculture, Forestry and Fishing"
if compare == "None"
search = "None"
rain_fall_type
elsif compare == "All"
rain_fall_type = compare
data = [
"Crops",
"Livestock",
"Forestry and Logging",
"Fishing and Aquaculture",
]
else
search = "None"
rain_fall_type = compare
end
elsif rain_fall_type == "None"
rain_fall_type
data = [
"Primary",
]
else
data = [
"Agriculture, Forestry and Fishing",
"Mining and Quarrying",
]
end
......
我希望此部分位于其他文件中,并希望按原样调用它。我可以编写一个函数和一个方法并返回值。我的问题是我可以按原样调用此代码块,而无需返回函数或任何东西。例如,我需要执行以下操作:
a = if test == "a"
#my code
end
#and in my controller
def test
a
end
我们可以用ruby做到这一点吗?将所有代码块放在一个文件中,然后在我的控制器中调用该值。
答案 0 :(得分:0)
给您一个简短的答案,以便您可以立即开始,您可以执行以下操作:
if search == 'Primary'
data, search = RainFallSearcher.call(rain_fall_type, compare)
end
class RainFallSearcher
def call(rain_fall_type, compare)
if rain_fall_type == "Agriculture, Forestry and Fishing"
if compare == "None"
search = "None"
rain_fall_type
elsif compare == "All"
rain_fall_type = compare
data = [
"Crops",
"Livestock",
"Forestry and Logging",
"Fishing and Aquaculture",
]
else
search = "None"
rain_fall_type = compare
end
elsif rain_fall_type == "None"
data = [
"Primary",
]
else
data = [
"Agriculture, Forestry and Fishing",
"Mining and Quarrying",
]
end
return data, search
end
end
然后您可以在Rails加载的位置放置RainFallSearcher
(我会选择app/services
。
不必强迫您将所有逻辑都包含在控制器或模型中,实际上建议使它们非常薄,并创建简单(或复杂)的Ruby对象来处理逻辑。
我在Rails中喜欢的“模式”之一是“服务对象”(有各种各样的讨论和命名约定),所以在google上您可以获取更多信息。
本文颇具解释性:https://www.engineyard.com/blog/keeping-your-rails-controllers-dry-with-services