Gary Vlc
Gary Vlc

Reputation: 143

Can't save my data into sqlite database

I am trying to implement a Parking Permit application page using ROR. I couldn't get my data saved into the database. The permit database is associated with the user also. The program won't save the data and execute the else statement. There is no error generated, i think i have missed something but i don't know the exact problem. Any help is appreciated!

Permit_controller.rb

class PermitsController < ApplicationController
  before_action :set_permit, only: [:show, :destroy]
  def index
    @permits = Permit.all
  end

  def new
    @permits = Permit.new
  end

  def create
    @permits = Permit.new(permit_params)
    if @permits.save
      redirect_to root_path
    else
      redirect_to contact_path
    end
  end

  def destroy
  end

  def show
    @permits = Permit.find(params[:id])
  end
  private
  # Use callbacks to share common setup or constraints between actions.
  def set_permit
    @permits = Permit.find(params[:id])
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def permit_params
    params.require(:permit).permit(:vehicle_type, :name, :studentid, :department, :carplate,:permitstart, :permitend)
  end
end

Permit.rb

class Permit < ApplicationRecord
  belongs_to :user
end

Create_permit.rb

class CreatePermits < ActiveRecord::Migration[5.0]
  def change
    create_table :permits do |t|
      t.string :vehicle_type
      t.string :name
      t.string :studentid
      t.string :department
      t.string :carplate
      t.date :permitstart
      t.date :permitend
      t.references :user, foreign_key: true

      t.timestamps
    end
    add_foreign_key :permits, :user
    add_index :permits, [:user_id, :created_at]
  end
end

User.rb

    class User < ApplicationRecord
      has_secure_password
      has_many :permits
    end

    #book pg 264 Validation

permit/new.html.erb
<% provide(:title, 'New Permit') %>
<h1>Permit Application</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@permits) do |f| %>

        <%= f.label :"Vehicle" %>
        <%= f.text_field :vehicle_type, class: 'form-control' %>

        <%= f.label :"License Plate" %>
        <%= f.text_field :carplate, class: 'form-control' %>

        <%= f.label :"Student ID" %>
        <%= f.text_field :studentid, class: 'form-control' %>

        <%= f.label :name %>
        <%= f.text_field :name, class: 'form-control' %>

        <%= f.label :"Department of applicant" %>
        <%= f.text_field :department, class: 'form-control' %>

        <%= f.label :permit_start %>
        <%= f.date_select :permitstart, class: 'form-control' %>

        <%= f.label :permit_end %>
        <%= f.date_select :permitend,  class: 'form-control'  %>


        <%= f.submit "Submit", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>

schema.rb

ActiveRecord::Schema.define(version: 20160921071908) do


  create_table "permits", force: :cascade do |t|
    t.string   "vehicle_type"
    t.string   "name"
    t.string   "studentid"
    t.string   "department"
    t.string   "carplate"
    t.date     "permitstart"
    t.date     "permitend"
    t.integer  "user_id"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
    t.index ["user_id"], name: "index_permits_on_user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at",      null: false
    t.datetime "updated_at",      null: false
    t.string   "password_digest"
    t.integer  "user_type"
  end

end

Upvotes: 0

Views: 232

Answers (3)

CfourPiO
CfourPiO

Reputation: 351

Or you can just say that a permit has a single user and avoid the confusion.

#models/permit.rb
class Permit < ApplicationRecord
    has_one :user
end

#controllers/permit_controller.rb
def create
    @user = User.find(session[:user_id]) #use your session variable
    @permits = Permit.new(permit_params)

    if @permits.save
      @user.permits << @permits
      redirect_to root_path
    else
      redirect_to contact_path
    end
end

It will save permits for the logged in user.

Upvotes: 0

Serhii Danovskyi
Serhii Danovskyi

Reputation: 394

    module ApplicationHelper
     #for current user to use through out the app
        def current_user
                 @current_user ||= session[:current_user_id] && User.find_by_id(session[:current_user_id]) # Use find_by_id to get nil instead of an error if user doesn't exist
               end
 end

and

def create
        @permits = Permit.new(permit_params)
        @permits.user = current_user
        if @permits.save
          redirect_to root_path
        else
          redirect_to contact_path
        end
      end

test it

Upvotes: 0

Indrajeet Mishra
Indrajeet Mishra

Reputation: 105

check with this @permits.save!. it shows the exact error.

Upvotes: 3

Related Questions