0

Background: 'Add User' portion of an app works perfectly on two separate development machines, running two different OSes: Dev Machine 1 is a Mac running Catalina (10.15), Dev machine 2 is running an Ubuntu derivative (Pop!_OS 19.10). After pushing to a Digital Ocean Dokku server the 'Add User' functionality fails without error; hitting the submit button does nothing. 'Edit User' works in production, as well as dev.

The code is being managed via git, with no complications on that part. Therefore, the identical code is on three machines.

I rely on Devise for my user setup; however, skip registrations in order to restrict the public from creating an account. Instead I rely on cancancan with a role to create users. This all works in development, but I cannot see a proper error in production, it simply does a render :action => :new with no explicit error. I use Dokku, Rails 6.03 with Ruby Version 2.7.1

Development Log

 Started POST "/user_managements" for ::1 at 2021-01-23 13:30:48 -0500
Processing by UsersController#create as JS
  Parameters: {"authenticity_token"=>"zr4lstDZAfXC3dTf1UADmoa6jbZl5HNQZCuDDdnWBuqa32LtAnadmjYHN+PnVUfs6RFVwcJ03KtpaE/l5osdiQ==", "user"=>{"email"=>"[email protected]", "first_name"=>"Alice", "last_name"=>"Wonderland", "phone_number"=>"", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "superadmin_role"=>"0", "supervisor_role"=>"0", "user_role"=>"1"}, "commit"=>"Submit"}
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 2], ["LIMIT", 1]]
   (0.4ms)  SELECT COUNT(*) FROM "stores"
  ↳ app/controllers/application_controller.rb:33:in `set_search'
   (0.2ms)  BEGIN
  ↳ app/controllers/users_controller.rb:22:in `create'
  User Exists? (0.4ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "[email protected]"], ["LIMIT", 1]]
  ↳ app/controllers/users_controller.rb:22:in `create'
  User Create (0.4ms)  ***INSERT INTO "users" ("email", "encrypted_password", "created_at", "updated_at", "first_name", "last_name", "phone_number") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"  [["email", "[email protected]"], ["encrypted_password", "$2a$11$VNfiMFc2CrDrdtsa31wXkOyhz4D4TkPVTiyDfceO62UwfZdS9fAhS"], ["created_at", "2021-01-23 18:30:49.138574"], ["updated_at", "2021-01-23 18:30:49.138574"], ["first_name", "Alice"], ["last_name", "Wonderland"], ["phone_number", ""]]***
  ↳ app/controllers/users_controller.rb:22:in `create'
   (9.6ms)  COMMIT
  ↳ app/controllers/users_controller.rb:22:in `create'
Redirected to http://localhost:3000/user_managements
Completed 200 OK in 257ms (ActiveRecord: 11.3ms | Allocations: 8092)

Production Log (Note the absence of the "INSERT" statement.)

 Started POST "/user_managements" for 173.170.223.213 at 2021-01-23 17:35:02 +0000
2021-01-23T17:35:02.954032036Z app[web.1]: I, [2021-01-23T17:35:02.953856 #10]  INFO -- : [6c93c1d9-2122-4cda-8f39-ed32e42b39e0] Processing by UsersController#create as JS
2021-01-23T17:35:02.954859299Z app[web.1]: I, [2021-01-23T17:35:02.954744 #10]  INFO -- : [6c93c1d9-2122-4cda-8f39-ed32e42b39e0]   Parameters: {"authenticity_token"=>"IlDwRv3r8Qv51qXyg+roq5FiuJ+pbJjsZTlWjq50hxVKtGHptRSusL7Slf0oNiqqwN1VADhGrSbdt7GZVMp9rg==", "user"=>{"email"=>"[email protected]", "first_name"=>"", "last_name"=>"", "phone_number"=>"", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "superadmin_role"=>"0", "supervisor_role"=>"0", "user_role"=>"1"}, "commit"=>"Submit"}
2021-01-23T17:35:02.959242127Z app[web.1]: D, [2021-01-23T17:35:02.959108 #10] DEBUG -- : [6c93c1d9-2122-4cda-8f39-ed32e42b39e0]   User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 2], ["LIMIT", 1]]
2021-01-23T17:35:02.964234692Z app[web.1]: D, [2021-01-23T17:35:02.964099 #10] DEBUG -- : [6c93c1d9-2122-4cda-8f39-ed32e42b39e0]    (0.5ms)  SELECT COUNT(*) FROM "stores"
2021-01-23T17:35:02.983197832Z app[web.1]: I, [2021-01-23T17:35:02.982997 #10]  INFO -- : [6c93c1d9-2122-4cda-8f39-ed32e42b39e0]   Rendering users/new.html.erb within layouts/application
2021-01-23T17:35:02.985854583Z app[web.1]: I, [2021-01-23T17:35:02.985747 #10]  INFO -- : [6c93c1d9-2122-4cda-8f39-ed32e42b39e0]   Rendered users/new.html.erb within layouts/application (Duration: 1.7ms | Allocations: 905)
2021-01-23T17:35:02.989341142Z app[web.1]: I, [2021-01-23T17:35:02.989236 #10]  INFO -- : [6c93c1d9-2122-4cda-8f39-ed32e42b39e0] Completed 200 OK in 34ms (Views: 6.6ms | ActiveRecord: 1.0ms | Allocations: 4898)

=== relevant code begins below ===

Routes

    resources :paper_routes

  get 'stores/active/' => 'stores#active'
  get 'stores/inactive/' => 'stores#inactive'

  resources :stores do
    post :update_row_order, on: :collection
    resources :sheets
    collection do
    match 'search' => 'stores#search', via: [:get, :post], as: :search
    end
  end

  resources :user_managements, :controller => 'users'

  devise_for :users, :skip => [:registrations], controllers: { sessions: "users/sessions", passwords: "users/passwords" }

  as :user do
    root 'users/sessions#new'
    get 'users/edit' => 'users/registrations#edit', :as => 'edit_user_registration'
    put 'user' => 'users/registrations#update', :as => 'user_registration'
  end

 get 'dashboard' => 'home#index', as: 'dashboard'
 get 'reports' => 'reports#index', as: 'reports'
end

controllers/users_controller.rb

    def new
    @user = User.new
        respond_to do |format|
        format.html 
        format.json
      end
  end

  def create
    @user = User.new(user_params)
            if @user.save 
              flash[:notice] = 'User created'
              redirect_to user_managements_path and return
            else
              flash.now[:warning] = 'There were problems when trying to create a new User'
              render :action => :new
            end
   end

  def edit
    @user = User.find params[:id]
    respond_to do |format|
        format.html 
        format.json
      end
  end

 def update
  @user = User.find params[:id]
      if @user.update_attributes user_params
            flash[:notice] = 'User has been updated'
            redirect_to user_managements_path and return
        else
            flash.now[:warning] = 'There were problems when trying to update this User'
            render :action => :edit
        end
 end

(...)

 def user_params
      params.require(:user).permit(:id, :email, :password, :password_confirmation, :superadmin_role, :supervisor_role, :user_role, :first_name, :last_name, :phone_number)
 end

/views/users/new.html.erb

<%= form_with model: @user, url: user_managements_path, class: "form-group" do |f| %>
<div class="row pt-3">
  <div class="col-sm-12 col-md-4">
    <div class="field">
  <%= label_tag(:name, "Email") %>
  <%= f.text_field :email, :class => "form-control", :type => "text" %>
    </div>
  </div>
</div>
(...)

/views/users/edit.html.erb

<%= form_with model: @user, url: user_management_path(@user), class: "form-group" do |f| %>

<div class="row pt-3">
  <div class="col-sm-12 col-md-4">
    <div class="field">
  <%= label_tag(:name, "Email") %>
  <%= f.text_field :email, :class => "form-control", :type => "text" %>
    </div>
  </div>
</div>
(...)
12
  • Check the logs. Commented Jan 23, 2021 at 6:57
  • There is nothing evident in syslog or nginx. I've added the production and development dokku logs from the last attempt. The takeaway here is that there is no INSERT statement occuring on the production server. Commented Jan 23, 2021 at 18:38
  • It's rendering the new template, so @user.save is failing, how do you handle de error when the object fails to be saved? do you have a new.js view? Commented Jan 23, 2021 at 23:31
  • @arieljuod - I don't have a new.js I do a render new with flash message. I don't get an error in the logs and my flash message is generic. This works fine in development. Confused! Commented Jan 24, 2021 at 0:02
  • is it ok that your params in production have first_name and last_name as empty strings? you are comparing (or at least showing) two different requests in your question when comparing dev and production Commented Jan 24, 2021 at 0:59

1 Answer 1

1

If anyone has any insight as to why this worked in development but not production, I'd love to know. Seems like it had to do with not loading Devise first.

The original code in routes.rb:

resources :user_managements, :controller => 'users'
devise_for :users, :skip => [:registrations], controllers: { sessions: "users/sessions", passwords: "users/passwords" }

I switched the order around to:

devise_for :users, :skip => [:registrations], controllers: { sessions: "users/sessions", passwords: "users/passwords" }
resources :user_managements, :controller => 'users'

Which solved the problem. Thank you again, @idmean, @arieljuod, @max and @jim!

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.