Skip to main content

Stuck on creating new record

Rails • Asked by Nelson

I'm not sure why I'm so lost on this one, I dont rally have a ton of experience with Rails but I did a blog with basic CRUD functionality and that was all good but this new project its just giving me a massive headache!

The app is very small, it uses Devise for auth so the idea is that a user creates an account and then from that account it can have a dashboard display information... that bit is working fine... the problem comes when I want the user to add new records to an 'Accounts' table...

Database schema is like this:

  • Users (devise)
  • Accounts
  • Usage

So every user can create (and have) many accounts and every account can have many (Usage[s])

My routes:

Rails.application.routes.draw do
  devise_for :users
  root 'home#index'

  resources :account do
    resources :usage
  end
end

The accounts_controller.rb

class AccountController < ApplicationController
  def new
    @account = Accounts.new
  end

  def create
    @account = Account.new(
      :user_id => current_user.id,
      :user_name => account_params[:user_name],
      :password => account_params[:password])
    if @account.save
      render root_path
    end
  end

  private
  def account_params
    params.require(:account).permit(:user_name, :password)
  end
end

The new.html.erb for Accounts

<h1>Add account</h1>

<%= form_for @account, account_path do |f| %>
  <%= f.text_field :user_name, placeholder: 'Username' %>
  <%= f.password_field :password, placeholder: 'Password' %>
  <br /><br />
  <%= f.submit 'Create', class: 'waves-effect waves-light btn' %>
<% end %>

The error I'm getting:

***ActionController::UrlGenerationError in Account#new
Showing /app/views/account/new.html.erb where line #7 raised:

No route matches {:action=>"show", :controller=>"account"}, missing required keys: [:id]*

I tried to nest my routes for Accounts inside the Users one and then I can create the account but the URL looks ugly...

I dont want /users/1/accounts/new its just not right because why would I want to display my current user ID... i want /accounts/new that one makes sense...

Any help please.


Hey Nelson,

You should be able to just remove account_path from form_for. Rails is smart enough to parse the correct paths from the object as long as you stick to the rails convention.

https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for


Hi Jacob! Thanks for your reply... I just did and error mutated into:

**NoMethodError in Account#new
Showing /app/views/account/new.html.erb where line #7 raised:

undefined method 'accounts_path' for #<#< Class:0x00007fea9b19aa40 >:0x00007fea9944e478>
Did you mean? account_path**

(?)


Can you verify your new method? Above its Accounts.new (plural) but it should be Account.new (singular)

You also have class AccountController < ApplicationController which should use the plural form class AccountsController < ApplicationController

Check https://alexander-clark.com/blog/rails-conventions-singular-or-plural for an outline of the rails naming conventions.

Are you using the rails scaffold generator to generate your models, controllers, and views? You'll want to read up on them if you haven't, it will show you the "rails" way of doing things while working on your project.


Thanks Jacob... I havent been using the scaffold generator, but I will do in the future to avoid these confusions.


Login or Create An Account to join the conversation.

Subscribe to the newsletter

Join 24,647+ developers who get early access to new screencasts, articles, guides, updates, and more.

    By clicking this button, you agree to the GoRails Terms of Service and Privacy Policy.

    More of a social being? We're also on Twitter and YouTube.