Ruby on rails 如何在Rails中构造控制器,以便在表单提交中创建多个模型?
我正在构建一个Rails应用程序Rails 4.1.0,在组织表单逻辑时遇到了一些问题。我认为这是因为我基本上缺少一些关于Rails路由和如何处理它的知识,所以如果这个问题是基本的,我很抱歉 这就是my routes.rb的外观:Ruby on rails 如何在Rails中构造控制器,以便在表单提交中创建多个模型?,ruby-on-rails,Ruby On Rails,我正在构建一个Rails应用程序Rails 4.1.0,在组织表单逻辑时遇到了一些问题。我认为这是因为我基本上缺少一些关于Rails路由和如何处理它的知识,所以如果这个问题是基本的,我很抱歉 这就是my routes.rb的外观: Rails.application.routes.draw do resources :users do resources :addresses resources :appointments resources :boxes do
Rails.application.routes.draw do
resources :users do
resources :addresses
resources :appointments
resources :boxes do
resources :statuses
end
resources :statuses
end
end
用户在登录页上用自己的姓名、电子邮件和密码注册。之后,他们会立即收到一个表单,在该表单中,他们可以使用“我的表单”中的字段_创建约会并添加地址-请参见下文。此表单与将来所有约会请求使用的表单相同。此外,每次用户提交约会请求时,都会向数据库中添加一些框,并将它们与该用户绑定
我的问题是,我在哪里处理此表单提交的所有逻辑?在登录页上,我有创建新用户的表单。但是,每次我添加新约会时,我是否也会将表单提交给用户控制器的create方法?这似乎不是正确的方法,因为我正在创建一个约会,并可能创建/更新地址
我很熟悉的领域,我正在使用它在我的形式。这是用户在注册后立即看到的表单,并被发送到他们的仪表板,该仪表板现在是/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
您能在控制器中显示您的def user_参数吗?我怀疑它缺少一个:addresses\u attributes组件。它可能看起来像这样我只是在编这些属性:
def user_params
params.require(:user).permit(:first_name, :last_name, addresses_attributes: [:street, :city, :state]
end
如果需要手动处理任何内容,请在模型层中执行。但是,接受\u嵌套的\u属性\u应该为您完成所有工作。你到底遇到了什么问题?在我的用户控制器的创建方法中,我有在提交新用户表单后创建新用户的逻辑。我应该把这个新表单的逻辑也放在create方法中吗?或者我应该把它放在别的地方?因为我的所有其他模型都属于用户,所以在我的应用程序中将有多个地方我以嵌套形式提交数据。所有这些嵌套表单是否也应该在create方法中包含它们的逻辑?或者他们会在用户控制器中使用其他方法吗?我很难准确地理解我将把这个表单放在哪里。谢谢你的帮助!