TlfT
TlfT

Reputation: 35

?? Rails 4.0 submiting range_field does not update params

I am thankful to be in the presence of experts

I am trying to use range_field sliders to update some user params/integers.
When I submit the form, the params update temporarily in a <%= @user.risk %> text field I have off to the side, but do not save to the database, when I reload the changes are gone. I am drawing heavily from Michael Hartl's Rails 4.0 Tutorial.

Below I initially used form_for(@user) but current_user seems to work better overall. `

 <%= form_for(current_user) do |f|%>

       <%= f.range_field :risk, :in=>0..100, :id=>"slider1"%>

      <%= f.range_field :tax, :in=>0..100, :id=>"slider2"%>

       <%= f.range_field :income, :in=>0..100, :id=>"slider3"%>

       <%= f.range_field :international, :in=>0..100,:id=>"slider4"%>
       <%= f.submit "Save Profile" %>
  <% end %>`

class UsersController < ApplicationController

 def show
   @user = User.find(params[:id])
  end

  def new
   @user = User.new
  end

 def create
    @user = User.new(user_params)
  if @user.save
    sign_in @user
    flash[:success] ="Welcome"
    redirect_to @user
  else
    render 'new'
   end
  end

  def edit
  end

 def update
   @user = User.find(params[:id])
  if @user.update_attributes(user_params) 
   flash[:success] = "Profile Updated"
   redirect_to @user   
  else render 'edit'
   end
  end

 private

    def user_params
      params.require(:user).permit(:name, :email, :password, 
:password_confirmation, :risk, :tax, :income, :international)
  end
end

class User < ActiveRecord::Base


 before_save :set_default
 before_save { self.email = email.downcase }
 before_create :create_remember_token
 validates :name, presence: true, length: { maximum: 50 }
 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
 validates :email, presence: true, format: { with: 
VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
 has_secure_password
 validates :password, length: { minimum: 6 }


def User.new_remember_token
  SecureRandom.urlsafe_base64
end

def User.encrypt(token)
  Digest::SHA1.hexdigest(token.to_s)
end

def set_default
   self.risk = "50"
   self.tax = "50"
   self.income = "50"
   self.international = "50"
end

  private

   def create_remember_token
     self.remember_token = User.encrypt(User.new_remember_token)
   end
end

And the output at the console, after I try to update params via range_field, and input User.find(4)

=> #<User id: 4, name: "Tony", email: "[email protected]", created_at: "2013-09-23 06:37:22",
updated_at: "2013-09-23 06:37:23", password_digest: "...", remember_token: "...", 
risk: 50, tax: 50, income: 50, international: 50> 

This is the output of my local WEBRick Rails Server

Started PATCH "/users/1" for 127.0.0.1 at 2013-09-23 06:15:32 -0700
Processing by UsersController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "user"=>{"risk"=>"70", "tax"=>"61", "income"=>"54", "international"=>"58"}, "commit"=>"Save Profile", "id"=>"1"}
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", "1"]]
   (0.0ms)  begin transaction
  User Exists (0.1ms)  SELECT 1 AS one FROM "users" WHERE (LOWER("users"."email") = LOWER('[email protected]') AND "users"."id" != 1) LIMIT 1
   (0.0ms)  rollback transaction
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."remember_token" = '.....' LIMIT 1
   (0.0ms)  begin transaction
  CACHE (0.0ms)  SELECT 1 AS one FROM "users" WHERE (LOWER("users"."email") = LOWER('[email protected]') AND "users"."id" != 1) LIMIT 1
   (0.0ms)  rollback transaction
  Rendered users/edit.html.erb within layouts/application (1.9ms)
  Rendered layouts/_header.html.erb (0.2ms)
Completed 200 OK in 8ms (Views: 6.0ms | ActiveRecord: 0.3ms)

Thank you all very much

Upvotes: 1

Views: 450

Answers (1)

TlfT
TlfT

Reputation: 35

The solution was simple

def update
   @user = User.find(params[:id])
   @user.update_attributes!(user_params)

.....

Upvotes: 0

Related Questions