Ruby on rails 如何允许个人注册';事件';,并创建一个';用户';同时在轨道上

Ruby on rails 如何允许个人注册';事件';,并创建一个';用户';同时在轨道上,ruby-on-rails,user-interface,refactoring,identity,Ruby On Rails,User Interface,Refactoring,Identity,我创建了一个简单的Rails应用程序,用户可以注册参加活动。为了创造令人愉悦的用户体验,身份不明的用户可以浏览事件,然后如果他们看到他们想要的事件,他们可以单击“注册事件”。使用Twitter引导,应用程序会向用户显示一个模式(弹出窗口),要求他们首先注册,以参加活动 模态上的形式如下所示: simple_form_for @user do |f| f.input :name, :placeholder => "Name", :label => false f.input :

我创建了一个简单的Rails应用程序,用户可以注册参加活动。为了创造令人愉悦的用户体验,身份不明的用户可以浏览事件,然后如果他们看到他们想要的事件,他们可以单击“注册事件”。使用Twitter引导,应用程序会向用户显示一个模式(弹出窗口),要求他们首先注册,以参加活动

模态上的形式如下所示:

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值传递给用户控制器的create操作。要处理此问题,创建操作将变为:

  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
对我来说,在控制器中处理这种复杂程度让人感觉很混乱,我想知道有什么更好的方法可以做到这一点


非常感谢您提供的任何重构帮助或建议。

如果已经登录的用户可以标记其出席活动的时间,您应该在这两个位置使用相同的代码。只需创建标记用户出席的助手,并从
userscoontroller#create
Events#attent
(或任何称为它的)操作调用它

现在——如果您听说过“胖模特,瘦控制器”模式,您可能开始注意到它是一个您可以使用它的地方

只需创建
User
model方法来参加某个事件,该事件将接受id或事件本身作为参数。这样,您只需在控制器中编写:

User.create(...).tap do |user|
  user.attend(params[:event_id]) if params[:event_id]
end

非常好-谢谢你,我以前没有遇到过tap方法,看起来很有趣。请注意这里根本不需要
#tap
方法。这是在创建或查找某些对象后对其进行后处理的好方法。这里真正重要的是在
用户
模型中定义方法
#attribute