Search code examples
ruby-on-railsrubyformsupdate-attributes

Updating a single attribute for a user


I have a user table, after the user is created I want to edit one attribute using the below code. This is my user edit view:

<h1>Please select below</h1>

<%= form_for @user do |f| %>

  <div class="form-group">
    <%= f.label :extra_activity %>
    <%= f.select(:extra_activity, [['P_Act', 1],['Ph_Act', 2], ['C_Act', 3]], class: 'form-control', required: true)  %></br>
  </div>

  <%= f.submit 'Submit', class: 'btn btn-primary btn-lg' %>
<% end %>

In my user controller I have the following methods for edit and update :

def edit
    @user = User.find(params[:id])
    @users = User.all
    @user_id = params[:user_id]
end

def update
    @user = User.find(params[:id])
    if @user.update_attributes(user_params)
        redirect_to new_user_activity_path(@user)
    else
        redirect_to home_path 
    end
end

user_params are listed below:

  def user_params
     params.require(:user).permit(:first_name, :surname, :previous_award, :chosen_award, :email, :password, :password_confirmation, :extra_activity)
  end

When i initially create the user, :extra_activity is set to 0. When the user clicks submit on the edit form, nothing happens, the user is redirected to home_path. I just need to update the user's :extra_activity attribute to whatever they select in the form. Can anybody suggest where I am going wrong here? Not sure how to save the selected number, as the updated value for :extra_activity

UPDATE:

class User < ActiveRecord::Base
   has_many :activities, dependent: :destroy
   has_many :weeks, dependent: :destroy
   authenticates_with_sorcery!
   validates :password, length: { minimum: 3 }
   validates :password, confirmation: true
   validates :email, uniqueness: true, email_format: { message: 'has invalid format' }
end

Solution

  • After reading your comments and checking the update, i guess the solution is to add:

    validates :password, length: { minimum: 3 }, if: :password

    The password is most likely stored in hashed form and not in password column. So if you reload the user the attribute is not set. The validation should be: IF the password is set, then make sure that it is at least of length 3 (which is pretty short).

    You should make sure that the password that is stored is not changed when you update the user through this controller.