0

我现在想的是……

我有一个装满书籍(条目)的图书馆。每本书都有许多结帐(嵌入文档)。

我想我想做的是,在结帐时,将新的“结帐”作为嵌入文档。签入时,我想编辑结帐并添加一个“date_checked_out”字段...

问题是,每次签入或签出时,我当前的模型/控制器都会创建一个新条目……所以它是双重冗余的……

解决这个问题的最佳方法是什么?需要更多细节?

结帐控制器:

  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
4

2 回答 2

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

我认为这是有道理的,因为其他阅读代码的人可以很容易地知道控制器操作在做什么,而不是创建和更新。

于 2013-05-16T02:36:31.517 回答
0

结帐有一个开始和结束日期是有道理的。签到时是否需要结帐?您可以在结帐控制器上将其更改为“更新”而不是“创建” - 在更新时输入 check_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
于 2013-05-15T19:33:17.000 回答