Rails,放置用户输入解析的地方

时间:2014-06-21 09:29:43

标签: ruby-on-rails ruby rails-activerecord helper

在我的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

一方面,模型应该照顾逻辑。另一方面,这不是真正的逻辑,更多的是输入法则......你觉得怎么样?

2 个答案:

答案 0 :(得分:2)

Helper

我将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