كيفية حفظ سجل مشارك بين العديد من الفصول الدراسية في روبي على القضبان
-
16-09-2019 - |
سؤال
لقد أنشأت ثلاث فئات لتمثيل كتب, الناس, ، و كتب bookloans. وبعد في حين أنني قادر على إظهار جمعية الناس إلى الكتب من خلال Bookloans لقد تم بذر قاعدة البيانات الخاصة بي.
أنا بحاجة الآن إلى حفظ الخروج من الكتاب. كان نيتي أن أفعل هذا الإجراء من خلال وحدة تحكم الكتاب. على وجه التحديد، إنشاء إجراء قرض في الكتب المكفوفين. في حين أن هذا منطقي لي من الناحية النظرية، أحصل على وقت فظيع تنفيذ بناء الجملة المناسب.
لقد أضفت القدرة على قرض كتاب من عرض العرض للكتاب. يحتوي هذا العرض الآن الآن على نموذج يستخدم إجراءات القرض لوحدة تحكم الكتاب لتسجيل القرض.
لقد أضفت ما أعتقده هو الأساليب المناسبة لطراز كتابي. بمساعدة 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
طريقة القروض من BooksControler
def loan
@book.add_loan(params[:book_loan][:person_id])
redirect_to :action => 'book', :id => params[:id]
end
كتاب عرض عرض ث / نموذج القرض
<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.build
و collection.create
— build
يشبه new
, create
يشبه 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_id
ل add_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
لذلك.