Rails:条件验证&查看

时间:2013-05-15 16:03:58

标签: ruby-on-rails validation conditional

我现在在想的是......

我有一个装满书籍(条目)的图书馆。每本书都有很多签出(嵌入式文档)。

我认为我想要做的是,在结账时,将新的“结帐”作为嵌入式文档。签到后,我想编辑结帐并添加“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

2 个答案:

答案 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

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