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