如何在Rails中构建我的控制器,以便我可以在表单提交上创建多个模型?

时间:2014-06-24 19:46:44

标签: ruby-on-rails

我正在构建一个Rails应用程序(Rails 4.1.0),我在组织表单逻辑时遇到了一些麻烦。我认为这是因为我从根本上缺少一些关于Rails路由以及如何处理它的知识,所以如果这个问题是基本的,我会道歉。

这就是我routes.rb的样子:

Rails.application.routes.draw do
  resources :users do
    resources :addresses
    resources :appointments
    resources :boxes do
      resources :statuses
    end
    resources :statuses
  end
end

User在着陆页上注明其姓名,电子邮件和密码。之后,他们会立即看到一个表单,他们可以在其中创建Appointment并添加Address(在我的表单中使用fields_for - 见下文)。此表单与将用于所有未来Appointment请求的表单相同。此外,每次User提交Appointment请求时,都会将一些Boxes添加到数据库中,并与User绑定。

我的问题是,我在哪里处理此表单提交的所有逻辑?在目标网页上,我有表单来创建新用户。但是,每次添加新的Appointment时,我都会将表单提交给create控制器的Users方法吗?这似乎不是接近它的正确方法,因为我正在创建Appointment(并可能创建/更新Address)。

我熟悉fields_for,我在表单中使用它。这是用户在注册后立即看到的表单,并被发送到他们的仪表板(现在是/ users / show /:id)。我现在以模态渲染它。

<%= form_for(@user) do |f| %>

  <%= f.fields_for :appointments do |appt| %>
    <%= appt.date_select :appointment_date %>
    <%= appt.time_select :appointment_start_time %>
    <%= appt.time_select :appointment_end_time %>
    <%= appt.text_area :comments %>
  <% end %>

  <%= f.fields_for :addresses do |addr| %>
    <%= addr.text_field :street_address %>
    <%= addr.text_field :street_address_optional %>
    <%= addr.text_field :city %>
    <%= addr.text_field :state %>
    <%= addr.number_field :zip_code %>
    <%= addr.check_box :primary %><%= builder.label :primary %>
  <% end %>

  <%= f.submit "Sign Up" %>

<% end %>

这就是我的UsersController的样子(除了更改show方法之外还没有做任何事情):

class UsersController < ApplicationController
  # GET /users/1
  # GET /users/1.json
  def show
    @user = current_user
  end

  # GET /users/new
  def new
    @user = User.new
  end

  # GET /users/1/edit
  def edit
  end

  # POST /users
  # POST /users.json
  def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        sign_in @user
        format.html { redirect_to new_appointment_url, notice: 'User was successfully created.' }
        format.json { render :new, status: :created, location: @appointment }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end
end

以下是我的模特:

class User < ActiveRecord::Base
  has_many :addresses, dependent: :destroy
  has_many :boxes, dependent: :destroy
  has_many :statuses, dependent: :destroy
  has_many :appointments, dependent: :destroy

  accepts_nested_attributes_for :addresses, :boxes, :statuses, :appointments
end

class Address < ActiveRecord::Base
  belongs_to :user
end

class Appointment < ActiveRecord::Base
  belongs_to :user
end

class Box < ActiveRecord::Base
  belongs_to :user
  has_many :statuses, dependent: :destroy
end

class Status < ActiveRecord::Base
  belongs_to :box
  belongs_to :user
end

1 个答案:

答案 0 :(得分:0)

您能在控制器中向我们展示您的def user_params吗?我怀疑它缺少一个:addresses_attributes组件。它应该看起来像这样(我只是编写这些属性):

def user_params
  params.require(:user).permit(:first_name, :last_name, addresses_attributes: [:street, :city, :state]
end