Rails 5-Devise-用户has_one关联-嵌套表单字段未在注册表单中显示

问题描述 投票:0回答:1

当我搜索时,这是一个常见问题,但是我发现的答案都不适用于我的情况。我已经设计出一个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>
...

但是未显示我的联系方式字段。有什么想法吗?

ruby-on-rails ruby devise ruby-on-rails-5 nested-forms
1个回答
3
投票

您必须“播种”该关系,以便出现输入的关联。 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
© www.soinside.com 2019 - 2024. All rights reserved.