Rails 5 - разработка - пользовательская ассоциация has_one - вложенные поля формы не отображаются при регистрации - PullRequest
0 голосов
/ 20 января 2020

Пока я искал, это распространенная проблема, но ни один из ответов, которые я нашел, не помог мне. Я настроил пользовательскую модель с помощью devise, и у нее есть две связанные модели, одна контактная информация и много адресов. Вложенная форма хорошо работает с адресами, но мои поля контактных данных не отображаются.

Моя модель пользователя выглядит следующим образом:

  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>
...

Но мои контактные данные не отображаются. Есть идеи?

1 Ответ

3 голосов
/ 20 января 2020

Вы должны "заполнить" отношение, чтобы появились входные данные для ассоциации. fields_for работает как al oop. Если связь пуста или равна нулю, блок запускается 0 раз.

Обычно вы делаете это в действии new вашего контроллера:

class UsersController < ApplicationController
  def new
    @user = User.new
    @user.build_contact_detail
  end
end

В Devise новым действием является 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...