在我的Rails应用程序中,有一个包含文本框和提交按钮的简单用户表单的视图 当用户提交表单时,根据他的输入,会创建不同的模型:
class MessageController < ApplicationController
def create
if is_foo params[:text]
Foo.create
else
Bar.create
end
end
def is_foo(text)
# Here the message gets parsed
# i.e if text[0] == "M"
end
end
我的问题是,您认为将“is_foo”逻辑放在Foo模型中而不是像这样的控制器是更好的设计吗?
型号:
class Foo < ActiveRecord::Base
def self.is_foo(text)
# Here the message gets parsed
# i.e if text[0] == "M"
end
end
控制器:
class MessageController < ApplicationController
def create
if Foo.is_foo params[:text]
Foo.create
else
Bar.create
end
end
end
一方面,模型应该照顾逻辑。另一方面,这不是真正的逻辑,更多的是输入法则......你觉得怎么样?
答案 0 :(得分:2)
我将is_foo
留出模型,因为模型逻辑应直接与模型有关,而不是确定应创建/保存哪个模型
我个人会考虑使用helper method
进行测试 - 调用文件ControllerHelper
或类似文件:
#app/helpers/controller_helper.rb
class ControllerHelper
def is_foo? text
# Here the message gets parsed
# i.e if text[0] == "M"
end
end
这将允许您调用控制器中的帮助程序,使您能够使用逻辑来形成修复程序:
#app/controllers/messages_controller.rb
class MessagesController < ApplicationController
include ControllerHelper
def create
model = is_foo?(params[:text]) ? "foo" : "bar"
model.constantize.send(:create)
end
end
答案 1 :(得分:2)
我不会将它称为Rich Pecks answer中提到的ControllerHelper
模块(因为Rails中的帮助程序与视图相关),但类似
# app/lib/foo_bar_creator.rb
FooBarCreator = Struct.new(:params) do
def create
build.save
end
def build
klass.new
end
def is_foo?
params[:text] == 'foo'
end
def klass
is_foo? ? Foo : Bar
end
end
(有些人称这类“服务对象”)
这样我就可以在控制器中调用FooBarCreator.new(params).create
。