1

ユーザーがイベントに参加するために登録できる簡単なRailsアプリケーションを作成しました。快適なユーザーエクスペリエンスを作成するために、身元不明のユーザーはイベントを閲覧し、イベントを希望するイベントが表示された場合は、[イベントに登録]をクリックできます。次に、Twitter Bootstrapを使用して、アプリケーションはユーザーにモーダル(ポップアップ)を表示し、イベントに参加するために最初に登録するように求めます。

モーダルの形式は次のとおりです。

simple_form_for @user do |f|
  f.input :name, :placeholder => "Name", :label => false
  f.input :email, :placeholder => "Email", :label => false
  f.input :postcode, :placeholder => "Postcode", :label => false
  hidden_field_tag :event_id, @event.id
  f.button :submit, "Sign me up for this event"
end

つまり、基本的に、event_id値をユーザーコントローラーの作成アクションに渡すことがわかります。これを処理するには、作成アクションは次のようになります。

  def create
    if params[:event_id].blank?
      event_registration = false
    else
      event_id = params[:event_id].to_s
      event_registration = true
    end

    if event_registration == true
      # The user is being created as part of signing up to an event
      @user_check = User.find_by_email(params[:user][:email])

      unless @user_check.nil?
        # The user already exists, but the visitor forgot
        @user = @user_check
      else
        # The user is a new sign up
        @user = User.new(params[:user])
      end

      # Now create the attendance for the user
      @event = Event.find(event_id)
      @attendance = @event.attendances.new
      @attendance.attendee = @user
      @attendance.save

      redirect_target = event_attendance_thank_path(@event, @attendance)

    else
      # The user is being created cleanly

      @user = User.new(params[:user])
    end

    if @user.save
      redirect_to root_path, notice: "Thanks for signing up, check your email"
    else
      # We should destroy the failing attendance?
      redirect_to root_path, alert: "Something's up with the signup.  Have you already registered with this email address?"
    end
  end

私にとって、コントローラーでこのレベルの複雑さを処理するのは面倒だと感じます。これについてもっと良い方法はないかと思います。

これをリファクタリングするためのヘルプやポインタをいただければ幸いです。

4

1 に答える 1

0

既にサインインしてログインしているユーザーがイベントへの出席をマークできる場合は、両方の場所で同じコードを使用する必要があります。ユーザーの出席をマークするヘルパーを作成し、UsersController#createEvents#attend(または呼び出されたものは何でも) の両方のアクションから呼び出すだけです。

さて、「ファット モデル、スキニー コントローラ」というパターンを聞いたことがある場合は、おそらくそれが使用できる場所であることに気付き始めているでしょう。

UserIDまたはイベント自体を引数として受け入れるイベントに参加するためのモデルメソッドを作成するだけです。このようにして、コントローラーに次のように簡単に書き込むことができます。

User.create(...).tap do |user|
  user.attend(params[:event_id]) if params[:event_id]
end
于 2012-11-19T10:11:08.047 に答える