我试图从我的控制器中删除代码部分,使其看起来干净和薄。在我的一个控制器中,我必须使用许多条件,这使我的控制器看起来非常沉重。我只是想删除其他文件中的代码块,并希望将其包含在我的控制器中。 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中将所有代码块放在一个文件中并在我的控制器中调用该值。
为了给你一个简短的答案,所以你可以马上开始你可以做这样的事情:
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中的一个“模式”是“服务对象”(有各种讨论和命名约定),所以谷歌,你可以获得更多信息。
这篇文章很有说服力:https://www.engineyard.com/blog/keeping-your-rails-controllers-dry-with-services