3

私はレールで手を試しています(4)。私は以前にいくつかのシナトラをやった.

ユーザーが組織名、住所、自分の名前、パスワードなどを入力できるサインアップフォームがあります。ユーザーと組織の2つのテーブルがあり、これらのテーブルにはサインアップデータが入力されます。したがって、2 つのアクティブなレコード モデルusersとがありorganizationsます。私のコントローラーは次のようになります。

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

質問に答えるには:

1) アプリ/モデルの登録クラスを (サインアップのユースケースに関連するため) サインアップ モジュールに移動します。

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

2) 私はあなたのアプローチが好きです。それは私がすることです。これは「Rails 方式」ではありませんが、優れていると思います。

3) いいえ。現在のところ、PORO (plain old ruby​​ object) を使用することは、どの単体テストでも問題なく、簡単にテストできます。

4) ヘルパーは (私の意見では) ビュー (およびコントローラー) 間で機能を共有するための古くて時代遅れの方法です。他に方法がまったくない場合を除いて、それらを使用しないでください (一部のライブラリで要求されている可能性があります ... )。あなたのように PORO を使用することは常に良いことです。

機能が必要でない限り、ActiveModel::Model を含める必要はありません。たとえば、検証。この場合、その機能の個々の部分を含めることができます。例えば

include ActiveModel::Validations
于 2014-12-11T11:45:50.390 に答える