ben jay hutton
ben jay hutton

Reputation: 404

Ruby on Rails - No data in Params to save in database

My problem is similar to this question: Ruby on Rails - Data not saved. Index showing blank values

However the strong params match the answers and no data seems to come through.

If I use params.require(:banktransaction).permit(...) I get an error: param is missing or the value is empty

If i remove the require part, a row is added but with no values.

I went through the view and controller and checked my spelling, for the life of me I can't see what I have missed, can anyone point me in the right direction?

controller:

class BankAccountsController < ApplicationController
  def delete
  end

  def destroy
  end

  def edit
  end

  def update
  end

  def index
    @bankaccount = BankAccount.all
  end

  def show
  end

  def new
    @banktransaction = BankAccount.new(:transactionDate => Time.now, :description => params[:description], :credit => params[:credit], :debit => params[:debit])
  end

  def create
    @banktransaction = BankAccount.new(bank_account_params)
    if @banktransaction.save
      flash[:notice] = "transaction added successfully."
      redirect_to(bank_accounts_path)
    else
      render('new')
    end
  end

  private
    def bank_account_params
      params.require(:banktransaction).permit(:transactionDate,:description,:credit,:debit)
    end
end

View:

<h1>BankAccounts#new</h1>
<p>Find me in app/views/bank_accounts/new.html.erb</p>
<div class="new transaction">
  <h2>Create Transaction</h2>

  <%= form_for(@banktransaction, :html => {:multipart =>true }) do |f| %>

    <%= render(:partial =>'form', :locals=> {:f => f}) %>

    <div class="form-buttons">
      <%= f.submit("Create Transaction") %>
    </div>

  <% end %>
</div>

Form partial:

<%= f.label(:transactionDate) %>: <%= f.date_field(:transactionDate) %><br>
<%= f.label(:description) %>: <%= f.text_field(:description) %><br>
<%= f.label(:credit) %>: <%= f.number_field(:credit) %><br>
<%= f.label(:debit) %>: <%= f.number_field(:debit) %><br>

routes:

Rails.application.routes.draw do

resources :bank_accounts do
  member do
      get :delete
    end
  end

  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

Upvotes: 1

Views: 193

Answers (1)

yeuem1vannam
yeuem1vannam

Reputation: 957

In short, you just permit wrong params key. It's bank_account and your bank_account_params should be

def bank_account_params
  params.require(:bank_account).permit(:transactionDate,:description,:credit,:debit)
end

The Rails's form builder will build your params base on model name, not variable name.

Your new action assign a BankAccount instance

  def new
    @banktransaction = BankAccount.new(:transactionDate => Time.now, :description => params[:description], :credit => params[:credit], :debit => params[:debit])
  end

so the form builder will use bank_account as the param key instead of variable name banktransaction

Upvotes: 1

Related Questions