Search code examples
ruby-on-railsruby-on-rails-4activerecordforeign-keysforeign-key-relationship

undefined method `loan_amount' for nil:NilClass


I am doing a jewel loan application using ruby 2.2.2p95 (2015-04-13 revision 50295) [i686-linux] and Rails 4.2.1 in that i am having two models:

1)jewelloan.rb 2)jltransaction.rb

I have added foreign key jewelloan_id to get the loan_amount in jltransactions table. Where as loan_amount is a field in jewelloans table.

My problem is foreign key relationship not working. I have searched many stackoverflow questions to solve this but that are not working.

I have attached my model,view,controller and everything. Please tell me where i did a mistake.

jewelloan.rb

  class Jewelloan < ActiveRecord::Base

    attr_accessor :transaction_amount

    attr_accessible :transaction_amount

    has_many :jltransactions, :dependent => :destroy

    accepts_nested_attributes_for :jltransactions ,:allow_destroy => true

    attr_accessible :account_number, :customer_name, :customer_address, :opened_on, :due_date, :amount, :jewel, :no_of_items, :gross_weight, :net_weight, :appraised_amount, :loan_amount, :transaction_mode, :transaction_type, :particulars, :comments, :close_date, :jltransactions_attributes

 end

jltransaction.rb

 class Jltransaction < ActiveRecord::Base

    attr_accessor :loan_amount

    attr_accessible :loan_amount

    belongs_to :jewelloan 

    attr_accessible :transaction_date, :transaction_amount, :transaction_mode, :transaction_type, :particulars, :comments, :jewelloan_id

 end

jewelloans_controller.rb

 class JewelloansController < ApplicationController

  def new
    @jewelloan = Jewelloan.new
  end

  def create
    @jewelloan = Jewelloan.create(jewelloan_params)
    if @jewelloan.save
      flash[:success] = "Special JL was successfully created"
      redirect_to @jewelloan
    else
      flash[:danger] = "Special Jewel Loan was not created"
      render 'new'
    end
  end

  private

    def jewelloan_params
      params.require(:jewelloan).permit(:account_number, :customer_name, :customer_address, :amount, :interest_rate, :opened_on, :due_date, :amount_due, :jewel, :no_of_items, :gross_weight, :net_weight, :appraised_amount, :loan_amount, :transaction_mode, :transaction_type, :particulars, :comments, :close_date, :no_of_days, :jltransactions_attributes)
    end

  end

jltransactions_controller.rb

 class JltransactionsController < ApplicationController

   def new    
     @jltransaction = Jltransaction.new
     @jewelloan = Jewelloan.new
   end

   def create
     @jltransaction = Jltransaction.create(jltransaction_params)  
     @jewelloan = @jltransaction.jewelloans(jewelloan_params)  
     if @jltransaction.save
       flash[:success] = "Transaction created"
       redirect_to @jltransaction
     else
       flash[:danger] = "Transaction was not created"
       render 'new'
     end
   end

 private
  def jltransaction_params
    params.require(:jltransaction).permit(:transaction_date, :transaction_amount, :transaction_mode, :transaction_type, :particulars, :comments, :jewelloan_id)
  end

 end

app/views/jltransactions/_form.html.erb

 <%= form_for @jltransaction do |jlt| %>

 <%= jlt.hidden_field :jewelloan_id, :value => @jewelloan.id %>

 <% if @jltransaction.errors.any? %>

 <h2>Transaction Failed</h2>
 <ul>

 <% @jltransaction.errors.full_messages.each do |error| %>

 <li><%= error %></li>

 <% end %>

 </ul>

 <% end %>    

 <%= jlt.label :loan_amount %>
 for<%= jlt.text_field :loan_amount, :disabled => true, :value => @jltransaction.jewelloan.try(:loan_amount) %>

 <%= jlt.label :transaction_amount %>
 <%= jlt.text_field :transaction_amount %>

 <%= jlt.submit "Submit Transaction", class: "btn btn-success" %> 

  <% end %>

rails console

 Completed 500 Internal Server Error in 34ms (ActiveRecord: 0.0ms)

 ActionView::Template::Error (undefined method `loan_amount' for nil:NilClass):

Please give some ideas to work the foreign key.

Thanks...


Solution

  • Your relationship might be returning nil result. Try

    @jltransaction.jewelloan.try(:loan_amount)