我已经创建了三个类来表示的图书 BookLoans 的。虽然我能够通过BookLoans向人们展示对书籍的关联我已经无欲无求我的数据库。

我现在需要保存一本书结账。这是我用心去做,通过这本书控制器此操作。具体地说,创建于BooksController中贷款的行动。虽然这对我来说很有意义理论上我有一个可怕的时间实施合适的语法。

我添加了从一本书的放映视图借出一本书的能力。此视图现在包含它使用书控制器的贷款动作来记录贷款的形式。

我已经添加了什么,我相信是适当的方法来我的书的模式。随着 theIV 帮助我已抓获在控制器中的相应信息。不幸的是,当我按书上显示贷款查看book_loan记录是不会被记录下来。

我是什么失踪?

图书模型

class Book < ActiveRecord::Base
  has_many :book_loans
  has_many :borrowers, :through => :book_loans, :source => :person

  accepts_nested_attributes_for :book_loans, :allow_destroy => true

  def loaned?
    book_loans.exists?(:return_date => nil)
  end

  def current_borrower
    if loaned?
      book_loans.first(:order => "out_date desc").person
    end
  end

  def add_loan (person_id)
      book_loans.create(:book_id => id,
                        :person_id => person_id,
                        :out_date => Date.current)
  end
end

<强>从BooksController中贷款方式

def loan
  @book.add_loan(params[:book_loan][:person_id])

  redirect_to :action => 'book', :id => params[:id]
end

图书展查看W /贷款形式

<p>
  <b>Title:</b>
  <%=h @book.title %>
</p>
<p>
  <b>Isbn10:</b>
  <%=h @book.isbn10 %>
</p>
<p>
  Currently loaned to:
  <%=h borrower_name(@book) %>
</p>

<% form_for(@book) do |x| %>
  <p>
    <%= x.label :loan_person_id %><br/>
    <%= collection_select(:book_loan, :person_id,
      Person.find(:all, :order => 'name ASC'), :id, :name) %>
    <%= x.submit 'Loan', :action => 'loan' %>
  </p>
<% end %>

<强> BookLoan模型

class BookLoan < ActiveRecord::Base
  belongs_to :book
  belongs_to :person
end

<强>角色模型

class Person < ActiveRecord::Base
  has_many :book_loans
  has_many :books, :through => :book_loans
end

<强>开发登录

Processing BooksController#update (for 127.0.0.1 at 2009-09-24 13:43:05) [PUT]
  Parameters: {"commit"=>"Loan", "authenticity_token"=>"XskHLuco7Q7aoEnDfVIiYwVrMEh5uwidvJZdrMbYYWs=", "id"=>"1", "book_loan"=>{"person_id"=>"3"}}
  [4;35;1mBook Columns (3.0ms)[0m   [0mSHOW FIELDS FROM `books`[0m
  [4;36;1mBook Load (4.0ms)[0m   [0;1mSELECT * FROM `books` WHERE (`books`.`id` = 1) [0m
  [4;35;1mSQL (0.0ms)[0m   [0mBEGIN[0m
  [4;36;1mBook Load (1.0ms)[0m   [0;1mSELECT `books`.id FROM `books` WHERE (`books`.`title` = BINARY 'Dreaming in Code: Two Dozen Programmers, Three Years, 4,732 Bugs, and One Quest for Transcendent Software' AND `books`.id <> 1) LIMIT 1[0m
  [4;35;1mSQL (1.0ms)[0m   [0mCOMMIT[0m
Redirected to http://localhost:3000/books/1
Completed in 19ms (DB: 10) | 302 Found [http://localhost/books/1]
  [4;36;1mSQL (0.0ms)[0m   [0;1mSET NAMES 'utf8'[0m
  [4;35;1mSQL (0.0ms)[0m   [0mSET SQL_AUTO_IS_NULL=0[0m
有帮助吗?

解决方案

当你has_many模型,您可以访问一些额外的方法,两个特别是collection.buildcollection.create- build就像newcreate就像create :)。看一看在有很多文档。在这种情况下,可以重写add_loan作为

def add_loan (person_id)
  book_loans.create(:book_id   => id,
                    :person_id => person_id,
                    :out_date  => Date.current)
end

或类似的东西。

要回答你什么视图将被发送到控制器的问题,它会发送params哈希像往常一样,但如果你只是想通过person_idadd_loan,可以提取。假设你已经在上面被包裹在一本书贷款形式的视图的一部分,您可以通过访问params[:book_loan][:person_id]的人。您还需要首先做在行动发现,否则@book将是零。

希望这有助于。欢呼声。

编辑:我不知道,如果你有它现在工作的方式,但我想你想改变你的Person模型阅读

class Person < ActiveRecord::Base
  has_many :book_loans
  has_many :books, :through => :book_loans
end

编辑2:您的开发日志说你实际上并没有打loan,你打update。有几件事情你可以做:检查以确保您已loan在你的路由上市资源;合并loan行动统一到update行动能开始得到那种凌乱,所以我不知道这是不是最好的办法。我敢肯定有更多,但这些都是突然想到的第一件事情。另外,我不知道,如果你可以添加:action => 'loan'到提交标签。我认为这将只是看那个,好像它是一个HTML选项。你可能想改变你的form_for阅读

<% form_for(@book), :url => { :action => 'loan' } do |x| %>

一旦你确信航线是为了。但正如我刚才所说,我敢肯定,因为你没有为它定义一个Book.find你会被扔在采取行动的错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top