在调用操作时获取用户标识

时间:2015-05-05 23:54:33

标签: ruby-on-rails ruby

我有一张用于在书籍上进行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

2 个答案:

答案 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)很好