'Edit page not rendered properly

I'm very new to RoR. I'm trying to learn. This is my user_controller update/edit part.

def edit
    binding.break
    @user = User.find(params[:id])
end

def update
    @user = User.find(params[:id])
    #binding.break
    
    if @user.update(params.require(:user).keep_if{|key|  @user.attributes[key] != params[:user][key]}.permit(:username, :email, :password))
         # Call to debugger
         flash[:notice] = "Article was updated successfully."
        redirect_to @user
    else
        #binding.break
        flash[:notice] = "Article was not updated successfully."
        render 'edit'
    end
    
end

This is my edit.html.erb file

<h1>Edit an existing User</h1>

<% if @user.errors.any? %>
  <h2>The following errors prevented the user from being saved</h2>
  <ul>
    <% @user.errors.full_messages.each do |msg| %>
    <%= puts msg%>
      <li><%= msg %></li>
    <% end %>
  </ul>
<% end %>
 
<%= form_with(model: @user, local: true) do |f| %>
  <p> 
    <%= f.label :username %><br/> 
    <%= f.text_field :username %>
  </p>
  <p>
    <%= f.label :email %><br/> 
    <%= f.text_field :email %> 
  </p>
  <p>
  <p>
    <%= f.label :password %><br/> 
    <%= f.password_field :password %> 
  </p>
  <p>
    <%= f.submit %> 
  </p>
<% end %>

The success case is working fine.

For the negative case where the update fails, I wanted to print the error messages for which the update failed and render it. But currently it just renders the edit page again. Also the @user in the else part of the controller is having the values which is invalid and those are getting filled in the edit page upon rendering. I want to reset to original values and show the errors for which it got failed.

The errors can be anything like, email format not correct or something.

Server logs says

    ↳ app/controllers/users_controller.rb:19:in `update'
  TRANSACTION (0.2ms)  rollback transaction
  ↳ app/controllers/users_controller.rb:19:in `update'
  Rendering layout layouts/application.html.erb
  Rendering users/edit.html.erb within layouts/application
Username has already been taken
  Rendered users/edit.html.erb within layouts/application (Duration: 23.0ms | Allocations: 2337)
  Rendered layout layouts/application.html.erb (Duration: 59.2ms | Allocations: 4962)
Completed 200 OK in 152ms (Views: 87.9ms | ActiveRecord: 5.0ms | Allocations: 11120)

Can someone shed some light on this?



Solution 1:[1]

render 'edit' with render edit without controller, you need to call @user = User.find(params[:id]) before render to get original value. If you want to show errors message, grant it to other const and render it in views

def edit
    binding.break
    @user = User.find(params[:id])
end

def update
    @user = User.find(params[:id])
    #binding.break
    
    if @user.update(params.require(:user).keep_if{|key|  @user.attributes[key] != params[:user][key]}.permit(:username, :email, :password))
         # Call to debugger
         flash[:notice] = "Article was updated successfully."
        redirect_to @user
    else
        #binding.break
        @errors = @user.errors
        @user = User.find(params[:id])
        flash[:notice] = "Article was not updated successfully."
        render 'edit'
    end    
end

in view, using @errors.full_messages

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1