Как очистить код и устранить исключение NoMethodError

Когда пользователь создает учетные записи, код должен позволять этому пользователю зарегистрировать учетную запись пользователя через Devise, а затем создать учетную запись и компанию.

Код должен перенаправлять на настройку мастера с помощью злого драгоценного камня. Пользователи имеют роли (rolify) и авторизованы в Cancancan.

Таблицы настраиваются с использованием ассоциации has_many:through. Кажется, это работает.

Модели следующие:

user
   has_many :accounts_users
   has_many :accounts, through: :accounts_users, dependent: :destroy
   has_one :company, through: :accounts, dependent: :destroy


users_account
    belongs_to :account
    belongs_to :user

account
    resourcify
    has_many :accounts_users
    has_many :users, through: :accounts_users, dependent: :destroy
    has_one :company

company
    belongs_to :account

Контроллер создания учетной записи выглядит следующим образом:

  def new
    @account = Account.new
  end

def create
    if !current_user.present?
      build_resource(sign_in_params)
      account = Account.find_or_create_by(org_name: params[:user]    [:account])
    else
      @account = current_user.accounts.create!(account_params)
    end

# create a default account and company
    @account.save!
    current_user.add_role 'owner'
    current_account = current_user.accounts.first
# create a company associated with the newly created account
    if current_account.companies.empty?
      company = current_account.companies.create(company_name: params[:org_name])
    else
      company = current_account.companies.first
    end
    resource.update(current_company: company.id)
    respond_to do |format|
      if @account.save
 # redirect to the relevant wizard
        format.html { redirect_to after_account_path(:add_account),     notice: 'Account was successfully created.' }
      else
        format.html { render action: 'new' }
        format.json { render json: @account.errors, status: :unprocessable_entity }
      end
    end
  end

ОТРЕДАКТИРОВАННАЯ ВЕРСИЯ

  def create
    @account = Account.create(account_params.except(:company))
    @account.save!
    respond_to do |format|
      if @account.save
        create_company
        format.html { redirect_to @account, notice: 'Account was successfully created.' }
        format.json { render :show, status: :created, location: @account }
      else
        format.html { render :new }
        format.json { render json: @account.errors, status: :unprocessable_entity }
      end
    end
  end

  def create_company
    current_user.add_role 'owner'
    current_account = current_user.accounts.first
    if current_account.company.nil?
      current_account.build_company(company_name: params[:org_name])
      @company.save!
    else
      company = current_account.company
    end
    resource.update(current_company: company.id)
  end

включено в помощник приложения:

  def current_account
    current_user.accounts.first
  end

  def current_company
    current_user.accounts.first.companies.first
  end

он перенаправляет (неожиданно) на отображение (показ) данных компании сразу после создания, я получаю ошибку метода nil/no.

индекс и как контроллер:

before_action :set_company, only: [:show, :edit, :update, :destroy,

:новый]

  def index; end

  def show
    @company = Company.find_by(id: params[:id])
  end


  def set_company
    @company = current_account.company
  end 

Кажется, это работает. Редактирование компании — это сложная задача, но она должна быть достигнута.

Любые советы по улучшению кода приветствуются


person Thierry    schedule 03.10.2019    source источник
comment
Я думаю, вы делаете это ненужным комплексом. Может ли пользователь иметь более 1 учетной записи? Ваше действие создания AccountsController имеет множество операторов if else. Перед строкой, говорящей @account.save, у вас есть оператор if else, если оператор if верен, вы не устанавливаете @account, поэтому вы даже не можете его сохранить...   -  person Hackman    schedule 03.10.2019
comment
Ok. Я переделываю его для простоты. Однако: мне нужно, чтобы у учетной записи было много пользователей, но только одна компания. У пользователя может быть много учетных записей.   -  person Thierry    schedule 09.10.2019


Ответы (1)


Думали ли вы о том, чтобы просто заставить внешний интерфейс обрабатывать случай, когда #name еще не установлен?

<=% @company&.name %>

or

<=% @company.name || "Unknown" %>
person sevensidedmarble    schedule 04.10.2019