我有一个包含这些列的用户模型 - name,email,books_on_loan
我有一个预订系统,用户可以在这里查看/阅读书籍。当用户检查书籍时,我想将他们的'books_on_loan_整数增加1,反之亦然。
到目前为止,我已经尝试过这样做了,并且收到错误“nil的未定义方法`+':NilClass” - 它不喜欢@ user.books_on_loan
def check_out
@params = params[:book]
title = @params[:title]
name = @params[:name]
@book = Book.find_by_title(title)
@user = User.find_by_name(name)
if @user == nil
@note = 'This user is not registered.'
elsif @book == nil
@note = 'This book is not in the library.'
elsif @book.onloan == 1
@note = 'This book is on loan.'
elsif @user.books_on_loan == 3
@note = 'This user already has 3 books out.'
else
@book.onloan = 1
@book.save
@books_loaned = BooksOnloan.create(book_id: @book.id, user_id: @user.id)
@books_loaned.save
@user.books_on_loan = @user.books_on_loan + 1
@user.save
@note = 'The book was checked out.'
end
respond_to do |format|
format.html
end
end
答案 0 :(得分:1)
试试这个:
@user.increment :books_on_loan, 1
答案 1 :(得分:1)
您可以尝试使用以下代码,这些代码将处理@ user.books_on_loan的nil值
@user.books_on_loan = @user.books_on_loan.to_i + 1
或
@user.books_on_loan = (@user.books_on_loan || 0) + 1
或
@user.books_on_loan = (@user.books_on_loan.present? ? @user.books_on_loan : 0) + 1
答案 2 :(得分:1)
虽然这里的大多数答案都没问题,但你宁愿改变问题的根源,否则你必须在整个应用程序中使用防范原因。
似乎books_on_loan
是db中的属性,所以:
change_column :users, :books_on_loan, :integer, default: 0
#and change existing bad data
User.update_all({books_on_loan: 0}, {books_on_loan: nil})
或者你可以改变班上的吸气剂:
def books_on_loan
super || 0
end
旁注,设计明智,在db中保留当前书籍的整数并不是一个好主意:你可以松开同步真实的书籍。
你宁可算一个真正的联想。
答案 3 :(得分:0)
您的用户在开始时没有加载图书,但在db
中,它未设置为0
,而是nill
。因此改变代码行
@user.books_on_loan = @user.books_on_loan + 1
与
@user.books_on_loan = (@user.books_on_loan || 0) + 1
如果@user.books_on_loan
为nill,则会使用0
,您的方法+
不会失败
答案 4 :(得分:0)
ost答案非常正确,但我想补充以下内容。
要回答您的问题,可以通过以下方式增加属性的值(即使是返回nil
的变量):
@user.books_on_loan =+ 1
递减:@user.books_on_loan =- 1
但是,您可以在此处利用正确的模型关联,并拥有 has_many - >通过 用户与预订之间的关系,通过为用户添加/删除图书,相应地调整计数器。
答案 5 :(得分:0)
Rails提供了您可以使用的实用抽象:increment
和decrement
。
所以你现在可以这样做:
@user.increment(:books_on_loan, 1)
增量需要2个参数。表列和递增的数字。如果为nil,则将属性初始化为零,并添加传递的值(默认值为1)。
同样可以使用
@user.decrement(:book_on_loan, 1)
有关此HERE
的更多信息