sixty4bit
sixty4bit

Reputation: 7926

Can't make 'username' attr accessible in User model (Rails 4 - Devise)

I decided after creating a User model through Devise to add a column for a username. I realized that I'd need to make it accessible so that the database would update correctly when a user submits the new user form. I then realized that since this is Rails 4 I have to do that through the controller, and Devise doesn't make a controller for my User model available. So I followed the instructions at the Devise page and created my own custom controller and changed the route to use it. Here is my custom controller, which I placed in apps/controllers/users:

class Users::RegistrationsController < Devise::RegistrationsController
  def new 
    super
  end

  def create
    super
  end

  def edit
    super
  end

  private

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

I then modified routes.db with:

devise_for :users, :controllers => { :registrations => "users/registrations" }.

My form looks like this:

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => {:class => 'form-horizontal'}) do |f| %>
  <%= devise_error_messages! %>

  <div class="control-group">
    <div class="control-label">
      <%= f.label :username %>
    </div>
    <div class="controls">
      <%= f.text_field :username %>
    </div>
  </div>

  <div class="control-group">
    <div class="control-label">
      <%= f.label :email %>
    </div>
    <div class="controls">  
      <%= f.email_field :email, :autofocus => true %>
    </div>
  </div>

  <div class="control-group">
    <div class="control-label">
      <%= f.label :password %>
    </div>
    <div class="controls">
      <%= f.password_field :password %>
    </div>
  </div>

  <div class="control-group">
    <div class="control-label">
      <%= f.label :password_confirmation %>
    </div>
    <div class="controls">
      <%= f.password_field :password_confirmation %>
    </div>
  </div>

  <div class="control-group">
    <div class="controls">
      <%= f.submit "Sign up" %>
    </div>
  </div>

  <div class="control-group">
    <div class="controls">
      Already have an account?  &nbsp;&nbsp;&nbsp; <%= render "devise/shared/links" %>
    </div>
  </div>
<% end %>

I copied the /devise/registrations' views to/users/registrations` per the instructions at the Devise page.

I'm not getting any errors but for whatever reason when I test the form it writes everything to the database except the username. I can go into the rails console and create users with usernames but it just won't happen with the form. My goal is to get the following line of code in application.html.erb to work:

Logged in as <%= current_user.username %>

But it never works and the failure is reflected in the console, which keeps showing the username as "nil."

Anyone know what I'm doing wrong? Where is the mistake?? I ran into a similar problem with my Post model with certain things not updating but I was able to fix it by changing which attributes were accessible in PostController. Thanks for any help!

Upvotes: 0

Views: 219

Answers (1)

jvnill
jvnill

Reputation: 29599

Looking at the registration controller of devise, it looks like it is not using user_params. Try changing user_params to sign_up_params.

Upvotes: 1

Related Questions