كيفية حفظ سجل مشارك بين العديد من الفصول الدراسية في روبي على القضبان

StackOverflow https://stackoverflow.com/questions/1472869

سؤال

لقد أنشأت ثلاث فئات لتمثيل كتب, الناس, ، و كتب 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.createbuild يشبه 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 لذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top