我在这里迁移了一个新的数据库表,它看起来像这样:
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
请帮助我。我对红宝石很新,我应该做什么,我需要跑什么?谢谢!
答案 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 %>