AllenC
AllenC

Reputation: 2754

Cannot retrieve attr_accessor in Rails 4

I'm working on a Ruby on Rails project and I have two models:

1. User

2. Merchant

their relationships are:

User has_one :merchant

Merchant belongs_to :user

then in my user.rb

attr_accessor :merchant_name
after_create :create_merchant

def create_merchant
  create_merchant(name: merchant_name)
end

In my user's form:

= form_for @user do |f|
  = f.text_field :merchant_name
  = f.text_field :email
  = f.text_field :password

the problem is the user and a merchant has been created but the merchant's name is nil

In my Account::RegistrationsController

class Account::RegistrationsController < Devise::RegistrationsController

  protected
  def after_sign_up_path_for(resource)
    account_users_path
  end


  private

  def registration_params
    params.require(:user).permit(:merchant_name)
  end

end

I'm getting this error:

  Processing by Account::RegistrationsController#create as HTML
      Parameters: {"utf8"=>"✓", "authenticity_token"=>"ht8vHG8I4bz2ylt+mtLC7hilQnK3VnYtcHgSNv8nSeg=", "user"=>{"merchant_name"=>"Zara 123", "email"=>"[email protected]", 
"password"=>"[FILTERED]", 
"password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign Up"}

    Unpermitted parameters: merchant_name

Upvotes: 2

Views: 623

Answers (2)

Alexander Kireyev
Alexander Kireyev

Reputation: 10825

Perhaps it should be

attr_accessor :merchant_name
after_create :create_merchant

def create_merchant
  build_merchant(name: merchant_name)
  save
end

create_association hasn't supported in rails 4

Also don't forget to permit merchant_name. According to this info:

class Account::RegistrationsController < Devise::RegistrationsController

  before_action :configure_permitted_parameters

  protected
  def after_sign_up_path_for(resource)
    account_users_path
  end

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :merchant_name
  end
end

Upvotes: 3

mountriv99
mountriv99

Reputation: 918

I wouldn't override the create_merchant method if I were you, try something like this:

after_create -> { create_merchant!(:name => self.merchant_name) }

and make sure your merchant_name is permitted in the users controller, something like this:

def create
  @user = User.new(user_params)
  if @user.save
    redirect_to @user
  else
    render :new
  end
end

private

def user_params
  params.require(:user).permit(:merchant_name, :email, :password, :password_confirmation)
end

Upvotes: 3

Related Questions