我有一张用于在书籍上进行CRUD操作的表格,而且用户也可以登记书籍(结账时我是一个不同的控制人员)
目前办理登机手续时,我无法更新用户数据 - 他们已借出多少本书的整数
以下是我的表格的一部分:
<% @books.each do |book| %>
<tr>
<td><%= book.title %></td>
<td><%= book.author %></td>
<td class ="onloan"><%= book.onloan %></td>
<td><%= link_to 'show', book %> </td>
<td><%= link_to 'edit', edit_book_path(book) %></td>
<td><%= link_to 'Destroy', book, method: :delete, data: { confirm: 'Are you sure?' } %></td>
<td><%= link_to 'Check in', check_in_path(book)%></td>
</tr>
<% end %>
我要添加的内容类似于
@user = User.find(params[:id])
@user.books_on_loan - 1
这是我的控制器的def检查:
def check_in
Book.find(params[:id]).update_attribute(:onloan, 0)
redirect_to root_path
end
答案 0 :(得分:0)
如果您想在每次执行books_on_loan
操作时更新@user
扣除1
的{{1}}列/属性,则需要将方法更改为做这样的事情:
check_in
修改强>
您需要通过某种方式了解用户ID,因为我对代码进行了评论,您需要通过包含用户ID的变量更改def check_in
@book = Book.find params[:id]
if @book.update_attribute :onloan, 0
@user = User.find params[:user_id] # Or change to get `@user.id` attribute
@user.books_on_loan = @user.books_on_loan - 1 # Current value - 1
@user.save
end
redirect_to root_path
end
。
如果你没有HTTP params上的ID,你需要在里面找到它。在您的示例中,您通过params[:user_id]
找到了User,但这实际上是此操作中Book Book的参数,它不能与User相同。
您的示例不足以确定如何获得用户ID,但我建议您将其存储在Book记录中。如果本书是唯一的,并且只有一个用户可以使用它,则可以向书籍添加列params[:id]
,然后您可以从书中获取用户ID。例如:
user_id
通过这种方式,您还可以在Book模型上放置def check_in
@book = Book.find params[:id]
if @book.update_attribute :onloan, 0
@user = User.find @book.user_id
@user.books_on_loan = @user.books_on_loan - 1 # Current value - 1
@user.save
end
redirect_to root_path
end
,并通过控制器上的belongs_to :user
获取用户。
更好的是:如果您的用户模型上有@book.user
,则可以通过简单的@user.books.count
来获取用户的“借阅书籍”。这样做,您可以使用更新方法删除Book的has_many :books
属性。
无论如何,你需要在你的控制器的books_on_loan
动作(假设你有一个)上设置本书的user_id
。
如果你这样做,check_out
行动将是这样的:
check_in
如果这仍然很复杂,您可以查看有效记录关联指南:http://guides.rubyonrails.org/association_basics.html
答案 1 :(得分:0)
def check_in
@book = Book.find params[:id]
if @book.update_attribute :onloan, 0
@user = User.find params[:user_id] # Or change to get `@user.id` attribute
@user.books_on_loan = @user.books_on_loan - 1 # Current value - 1
@user.save
end
redirect_to root_path
end
这没关系,但是如果要获取用户ID,则需要指定params值。路径或嵌套路线都可以。
根据您的情况,我认为您没有嵌套路线。
隐藏属性或简称check_in_path(book, user_id: your_desired_user_id)
很好