当我搜索时,这是一个常见问题,但是我发现的答案都不适用于我的情况。我已经设计出一个User模型,它有两个相关模型,它有一个Contact Detail和许多地址。嵌套表单可以很好地处理地址,但是我的联系方式字段未显示。
我的用户模型如下:
validates_presence_of :contact_detail, :addresses
# Include default devise modules. Others available are:
# :lockable, :timeoutable, :trackable and :omniauthable
devise :invitable, :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable, :confirmable
has_one :contact_detail, dependent: :destroy
has_many :addresses, dependent: :destroy
accepts_nested_attributes_for :addresses,
allow_destroy: true
accepts_nested_attributes_for :contact_detail,
allow_destroy: true
联系人详细信息模型仅具有belongs_to :user
我进行了在我的应用程序控制器上的devise gem中提到的更改:
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [addresses_attributes: [:street_name, :street_number, :city, :country, :postal_code, :name],
contact_detail_attributes: [:first_name, :last_name, :description, :telephone, :mobile ]])
end
end
和我的app / views / devise / registrations / new.html.erb文件看起来像这样:
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
...
<div>
<% f.fields_for :contact_detail do |contact_detail|%>
<div class="field">
<%= contact_detail.label :first_name %>
<%= contact_detail.text_field :first_name %>
</div>
<div class="field">
<%= contact_detail.label :last_name %>
<%= contact_detail.text_field :last_name %>
</div>
<div class="field">
<%= contact_detail.label :description %>
<%= contact_detail.text_area :description %>
</div>
<div class="field">
<%= contact_detail.label :telephone %>
<%= contact_detail.number_field :telephone %>
</div>
<div class="field">
<%= contact_detail.label :mobile %>
<%= contact_detail.number_field :mobile %>
</div>
<% end %>
</div>
...
但是未显示我的联系方式字段。有什么想法吗?
您必须“播种”该关系,以便出现输入的关联。 fields_for
就像一个循环。如果关联为空或为零,则该块运行0次。
通常,您可以在控制器的new
操作中执行此操作:
class UsersController < ApplicationController
def new
@user = User.new
@user.build_contact_detail
end
end
在设计中,新动作是Devise::RegistrationsController#new
,您可以通过将控制器子类化来进行自定义:
class MyRegistrationsController < Devise::RegistrationsController
def new
super do |user|
user.build_contact_detail
end
end
end
super do |user| ... end
使用所有Devise控制器动作都占用一个块并产生资源这一事实。这使得自定义它们非常容易,而无需复制粘贴整个方法。
然后您必须更改路由,以便使用自定义控制器:
Rails.application.routes.draw do
devise_for :users, controllers: {
registrations: 'my_registrations'
}
end