Rails 5 Создание владельца через форму учетных записей (вложенные атрибуты)

avatar
Shawn Wilson
7 апреля 2018 в 21:40
107
2
0

Создание приложения Rails 5 с Ruby 2.4.0

У меня есть модель User (Devise) и модель Account

Я пытаюсь создать пользователя с помощью модели учетных записей, но получаю очень нечеткие выходные данные журнала, а учетная запись и пользователь не создаются.

Вывод журнала:

Started POST "/accounts" for 127.0.0.1 at 2018-04-07 15:25:10 -0600
Processing by AccountsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"c7H8MN2pbANsOsJH5PtX93+fAyqoLrBgZ0DfH7wQ8fCsMT0tgbr7TqeBML2/DbW7b4rwEiSlVY9aEFgRsK5uNA==", "owner"=>{"f_name"=>"xxxxxx", "m_name"=>"xxxxxx", "l_name"=>"xxxxxx", "office_country_code"=>"1", "office_telephone_number"=>"4036155915", "country_code"=>"1", "phone_number"=>"4036155915", "email"=>"xxxxxx@xxxxxx.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "account"=>{"subdomain"=>"TestDomain"}, "commit"=>"Create Account"}
   (1.0ms)  BEGIN
  Account Exists (1.7ms)  SELECT  1 AS one FROM "accounts" WHERE LOWER("accounts"."subdomain") = LOWER($1) LIMIT $2  [["subdomain", "testdomain"], ["LIMIT", 1]]
   (1.1ms)  ROLLBACK
Redirected to http://localhost:3000/accounts/new
Completed 302 Found in 119ms (ActiveRecord: 6.3ms)


Started GET "/accounts/new" for 127.0.0.1 at 2018-04-07 15:25:10 -0600
Processing by AccountsController#new as HTML
  Rendering accounts/new.html.erb within layouts/application
  Rendered accounts/new.html.erb within layouts/application (114.5ms)
Completed 200 OK in 1713ms (Views: 1669.1ms | ActiveRecord: 0.0ms)

моя модель User:

class User < ApplicationRecord

  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable

  validates :f_name, :l_name, :country_code, :phone_number, presence: true

end

Моя модель Account:

class Account < ApplicationRecord

  after_initialize :set_default_status, :if => :new_record?
  before_validation :downcase_subdomain

  RESTRICTED_SUBDOMAINS = %w(www admin)

  enum account_status: [:active, :inactive, :suspended, :vip]

  belongs_to :owner, class_name: 'User'
  has_one :subscription

  validates :owner, presence: true
  validates :subdomain, presence: true,
            uniqueness: {case_sensitive: false },
            format: { with: /\A[\w\-]+\Z/i, message: 'contains invalid caracters'},
            exclusion: {in: RESTRICTED_SUBDOMAINS, message: 'this name is restricted'}

  accepts_nested_attributes_for :owner

  private

  def downcase_subdomain
    self.subdomain = subdomain.try(:downcase)
  end

  def set_default_status
    self.account_status ||= 1
  end

end

мой контроллер Accounts:

class AccountsController < ApplicationController

  def new
    @account = Account.new
    @account.build_owner
  end

  def create
    @account = Account.new(account_params)
    if @account.save
      redirect_to root_path, notice: 'Welcome to RoadRouge - Account created successfully!'
    else
      redirect_to new_account_path, alert: 'A problem has occurred. Please try again.'
    end
  end

  private

  def account_params
    params.require(:account).permit(:subdomain, :owner_id, :subscription_id, :account_status, owner_attributes: [:f_name, :m_name, :l_name, :office_country_code, :office_telephone_number, :country_code, :phone_number, :email, :password, :password_confirmation])
  end

end

мой контроллер Application

    class ApplicationController < ActionController::Base
      protect_from_forgery with: :exception

      before_action :configure_permitted_parameters, if: :devise_controller?

      private

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:f_name, :m_name, :l_name, :office_country_code, :office_telephone_number, :country_code, :phone_number, :email, :password, :password_confirmation])
    devise_parameter_sanitizer.permit(:account_update, keys: [:f_name, :m_name, :l_name, :office_country_code, :office_telephone_number, :country_code, :phone_number, :email, :password, :password_confirmation])
  end
      end

    end

Не уверен, что я упускаю из виду что-то маленькое, но я в полной растерянности. Мы будем очень признательны за любую помощь.

Источник
gwalshington
7 апреля 2018 в 21:59
0

Пишет, что учетная запись с именем testdomain уже существует. В модели вашей учетной записи у вас есть :subdomain, uniqueness: {case_sensitive: false } — это означает, что никто не может создать учетную запись с таким же именем субдомена.

Pablo
8 апреля 2018 в 11:55
0

Помимо сообщения об ошибке, параметры, которые вы получаете, включают «владельца» и «учетную запись» на одном уровне (а не владельца внутри учетной записи, как вы хотите, на основе account_params)

Ответы (2)

avatar
Michael Arkhipov
7 апреля 2018 в 22:11
0

Для первого. :subdomain, uniqueness: {case_sensitive: false } делает атрибут subdomain уникальным для таблицы учетных записей. Похоже, что testdomain уже существует.

Более того, вам действительно нужно добавить id для owner_attributes:

def account_params
  params.require(:account).permit(
    :subdomain,
    :subscription_id,
    :account_status,
    owner_attributes: %i[id f_name m_name l_name office_country_code office_telephone_number country_code phone_number email password password_confirmation]
end
Shawn Wilson
8 апреля 2018 в 08:30
0

это странная часть. В приложении нет записей учетной записи. Это первая запись, которую я пытаюсь создать.

Michael Arkhipov
8 апреля 2018 в 09:03
0

@ShawnWilson Это действительно странно. Попробуйте отключить эту часть проверки. Каков будет результат?

Shawn Wilson
8 апреля 2018 в 16:38
0

когда я удаляю эту проверку, она все еще терпит неудачу, но нет объяснения, почему

Michael Arkhipov
9 апреля 2018 в 02:13
0

@ShawnWilson Еще раз привет. Попробуйте прочитать это: coderhelper.com/questions/1313149/…

avatar
andrew21
7 апреля 2018 в 22:03
0

Учитывая запросы, похоже, что он остановился на проверке поддомена. возможно ли, что поддомен уже существует? попробуйте открыть @account.errors, чтобы увидеть причину проблемы