Ruby Rails将属性更新为新的数据库表

时间:2014-01-09 06:41:07

标签: ruby-on-rails

我在这里迁移了一个新的数据库表,它看起来像这样:

  create_table "books", :force => true do |t|
    t.string   "books_title"
    t.integer  "books_count"
    t.integer  "user_id"
    t.datetime "created_at",   :null => false
    t.datetime "updated_at",   :null => false
  end

我的 models / books.rb 如下所示:

class Books < ActiveRecord::Base
  attr_accessible :books_count, :books_title
end

我正在尝试使用此代码创建新记录:

<%= form_for(@Books) do |f| %>

  <%= f.label :books_title, 'Book Title' %> 
  <%= f.text_field :books_title %>

<% end %>

然后我收到错误:undefined method books_title for NilClass:Class

我的 controllers / books_controller.rb 看起来像这样:

class BooksController < ApplicationController
end

请帮助我。我对红宝石很新,我应该做什么,我需要跑什么?谢谢!

3 个答案:

答案 0 :(得分:1)

其实“@books”不是“@Books” 而且我在控制器中看不到这一行,“@ books = Books.all” (实际上,它应该是书,模型名称是单数,表名是复数)..

欢迎来到rails ......

我会这样做,转到您的应用路径并输入

rails g scaffold book title:string count:integer user_id:integer

上面的命令将为您生成一切,从路由,模型,迁移,控制器,视图到测试用例。

不用担心任何事情。只是

运行rake db:migrate(由于你已经有了“书籍”表,它可能会抛出错误,放弃它)

现在访问http://localhost:3000/books,您将看到图书清单(索引视图)。现在,转到您的书籍控制器,并通过方法开始您的学习方法。

答案 1 :(得分:0)

您必须为form_for方法创建@book实例。

class StocksController < ApplicationController
  def new
    @book = Book.new
  end 
end

并查看。

<%= form_for(@book) do |f| %>

  <%= f.label :books_title, 'Book Title' %> 
  <%= f.text_field :books_title %>

<% end %>

您必须在图书管理员中使用create方法。

class StocksController < ApplicationController
  # ...
  def create
    @book = Book.create(book_params)
  end 
  private 
  def book_params
    params.require(:book).permit(:books_title)
  end
end

我建议您使用:title代替:books_title。因为它有点多余。

答案 2 :(得分:0)

  

我的controllers / books_controller.rb也是这样的:

     

类StocksController&lt; ApplicationController的   端

Rails有一个命名约定,即对文件使用与控制器相同的名称,因此您应该将StocksController重命名为BooksController或将books_controller.rb重命名为stocks_controller

在任何情况下,您都需要在其中执行操作,以初始化表单的book对象。并创建一个动作来保存它。另一件事是,将变量命名为小写变量是标准的,并且以单数形式命名,因此它将是@book

class BooksController < ApplicationController
  def new
    @book = Book.new
  end 

  def create
    @book = Book.create(params)
  end 
end

并将您的表单更新为

<%= form_for(@book) do |f| %>

  <%= f.label :books_title, 'Book Title' %> 
  <%= f.text_field :books_title %>

<% end %>