我正在构建一个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
答案 0 :(得分:0)
您能在控制器中向我们展示您的def user_params
吗?我怀疑它缺少一个:addresses_attributes
组件。它应该看起来像这样(我只是编写这些属性):
def user_params
params.require(:user).permit(:first_name, :last_name, addresses_attributes: [:street, :city, :state]
end