我现在在想的是......
我有一个装满书籍(条目)的图书馆。每本书都有很多签出(嵌入式文档)。
我认为我想要做的是,在结账时,将新的“结帐”作为嵌入式文档。签到后,我想编辑结帐并添加“date_checked_out”字段...
问题是,我现在的模型/控制器每次签入或结账时都会生成一个新条目...所以这是多余的......
最好的方法是什么?需要更多细节?
Checkout Controller:
def new
@entry = Entry.find(params[:entry_id])
@checkout = @entry.checkout.new
respond_to do |format|
format.html {render :layout => false}
end
end
def create
@entry = Entry.find(params[:entry_id])
@entry.update_attributes(:checked_out => "Out")
@checkout = @entry.checkout.create!(params[:checkout])
redirect_to "/", :notice => "Book Checked Out!"
end
class Checkout
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::MultiParameterAttributes
field :checkout_date, :type => Time
field :checkout_date_due, :type => Time
field :book_in, :type => Time, :default => Time.now
field :book_out, :type => Time, :default => Time.now
embedded_in :entries, :inverse_of => :entries
end
答案 0 :(得分:0)
结帐将有一个开始和结束日期是有道理的。签到时,您需要结帐吗?您可以在结帐控制器上将其更改为“更新”而不是“创建” - 在更新时输入checked_in_at。
具体来说 - 您希望能够在结账控制器上接受PUT - 这可以是通用的(允许您以多种方式更新结账)或具体,为您制定清理此路线的路线:
resources :checkouts do
put :checkin, :on => :member
end
在checkouts_controller中
def checkin
@checkout = Checkout.find(params[:id]
@checkout.update_attribute(:checked_in_at, Time.now)
# handle issues, redirect, etc.
end
答案 1 :(得分:0)
保持纯REST,向Checkout控制器添加更新操作。
另外,发布您的输入模型。我假设你的代码中有一个条目has_one checkout,而checkout属于一个条目。
类似的东西:
* 编辑,因为看起来OP希望在检查条件时看到这是如何工作的
... original boilerplate code ommitted
def update
@entry = Entry.find(params[:entry_id])
# if the book is checked out
if @entry.checked_out == "out"
# then update it
@entry.update_attributes(:checked_out => "whatever" # though I'd seriously consider changing checked out to a boolean - if it's either out or in, true or false makes sense. Ignore this advice if there are more than two states
@checkout = @entry.checkout
respond_to do |format|
if @checkout.update_attributes(:checked_out => "newValue")
...
else
.. handle errors
end
end
else
#the book does not have the correct status
respond_to do |format|
format.html { redirect_to some_action_path, :notice => "Entry is not out, so we cannot update its status." }
format.json { render json: #entry.errors, status: :unprocessible_entry }
end
end
end
另外,如果您想让代码更明确一些,您可以考虑使用swards建议并创建一些命名端点,如
def checkout
end
def checkin
end
我认为这是有道理的,因为阅读代码的其他人可以很容易地确切地知道控制器操作正在做什么,而不是创建和更新。