0

我已经创建了三个类来表示书籍BookLoans的关联记录之间具有一对多类。虽然我能够通过BookLoans展示人与书的关联,但我一直在播种我的数据库。如何保存在Ruby on Rails的

我现在需要保存一本书的结帐。我打算通过图书管理员来执行此操作。具体而言,在BooksController中创建贷款操作。虽然这在理论上对我来说很有意义,但我有一段可怕的时间来实现适当的语法。

我已经添加了从书籍的展示视图中借阅图书的功能。这个视图现在包含一个表格,它使用账簿管理员的贷款行为来记录贷款。

我已经添加了我认为适合我的Book模型的方法。在theIV的帮助下,我已经在控制器中捕获了适当的信息。不幸的是,当我在书籍展示视图上按下贷款时,book_loan记录没有被记录。

我错过了什么?

Book模型从BooksController中

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

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

书显示视图

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 

贷款方法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 

回答

1

当你has_many模型,你得到一些额外的方法访问,二特别是collection.buildcollection.create - build就像new,create就像create :)。看看has many documentation。在这种情况下,您可以将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

+0

什么是创建视图的最佳选择。为了简单起见,我想用本书作为跳板点,这就是为什么我想通过person_id。目前我正试图在书籍编辑中添加一个额外的表单。 此外,感谢您的人,我会旋转我的轮子一点。 – ahsteele 2009-09-24 18:35:24

+0

您可以为图书贷款添加一个'fields_for'到您的图书表单。您也可以查看'acceptersted_attributes_for' http://www.railsapi.com/doc/rails-v2.3.4/classes/ActiveRecord/NestedAttributes/ClassMethods.html – theIV 2009-09-24 18:47:42

+0

对不起,扩大一点前面的评论。如果你为你的图书贷款添加一个'fields_for',你应该首先在你的控制器中建立一个图书贷款 - '@ loan = @ book.book_loans.build'-然后在@loan – theIV 2009-09-24 18:49:14