3

我正在尝试使用铁轨 (4)。我之前做过一些 Sinatra。

我有一个注册表单,用户可以在其中填写他的组织名称、地址和他自己的姓名、密码等。我有两个表 - 用户和组织,这些表填充了注册数据。所以,我有两个活动记录模型usersorganizations. 我的控制器如下所示:

class SignupsController < ApplicationController

  # GET /signup
  def new
    # show html form
  end

  # POST /signup
  def create
    @signup = Registration.register(signup_params)
    respond_to do |format|
      if @signup.save
        format.html { redirect_to @signup, notice: 'Signup was successfully created.' }
      else
        format.html { render action: 'new' }
      end
    end
  end

  private
    # Never trust parameters from the scary internet, only allow the white list through.
    def signup_params
      params[:signup]
    end
end

我没有任何Registration模型(数据库中的表)。我正在寻找这样的Registration模型(我应该称之为模型吗?)我可以在其中拥有类似的东西:

class Registration
  def self.register params
    o = Organization.new params
    u = User.new o.id, params
    self.send_welcome_email params[:email]
  end

  def send_welcome_email email
    #send email here
  end
end

1)那么我应该把这Registration门课放在哪里?

2)对于这种情况,这是正确的方法吗?如果没有,那么最好的方法是什么?

3)拥有这样的课程会影响运行任何单元测试吗?

4)我看到有文件,那有signup_helper.rb什么用SignupsController

4

3 回答 3

1

您可以include ActiveModel::Model在您的模型中执行此操作,它的行为将与普通模型一样。您将能够进行验证、回调。除了持久化到数据库之外的任何东西。

看看这个以获取更多信息。

于 2013-07-18T05:30:33.747 回答
0
class Registration
  include ActiveModel::Model

  def self.register params
    o = Organization.new params
    u = User.new o.id, params
    self.send_welcome_email params[:email]
  end

  def send_welcome_email email
    #send email here
  end
end
于 2013-07-18T07:22:22.803 回答
0

要回答您的问题:

1)我会将注册类移动到应用程序/模型中的注册模块(因为它与注册用例有关):

# apps/models/signup/registration.rb
module Signup
  class Registration
    ...
  end
end

2)我喜欢你的方法。这是我会做的事情。这不是“Rails 方式”,但在我看来它是优越的。

3) 没有。拥有一个 PORO(普通的旧 ruby​​ 对象)目前对于任何单元测试都很好,您可以轻松地对其进行测试。

4) Helpers 是一种(在我看来)在视图(和控制器)之间共享功能的陈旧过时的方法。除非绝对没有其他方法,否则不要使用它们(也许某些库需要它......)。像你一样使用 PORO 总是更好。

除非您需要它的功能,否则您不必包含 ActiveModel::Model。例如验证。在这种情况下,您可以包含其功能的各个部分。例如

include ActiveModel::Validations
于 2014-12-11T11:45:50.390 回答