无法保存或更新故障单状态

时间:2014-07-27 18:55:36

标签: ruby-on-rails ruby

我正在使用Ruby on Rails 4.1为我的示例项目创建一个票务预订应用程序。三个是三个模型 - 活动,门票和预订。活动有很多门票和预订。门票有很多预订,属于活动。预订属于活动和门票。

这是票证模型:

class Ticket < ActiveRecord::Base
 belongs_to :event
 has_many :bookings

 before_create :check_start_date
 before_update :check_start_date

def self.check_start_date
 if self.booking_start_date == Date.today
    self.update_attribute(:status => 'Open')
end
end

票务管理员:

 class TicketsController < ApplicationController

def index
    @event = Event.find(params[:event_id])
    @tickets = @event.tickets.all
end

def show
    @event = Event.find(params[:event_id])
    @ticket = @event.tickets.find(params[:id])
end

def new
    @event = Event.find(params[:event_id])
    @ticket = Ticket.new
end

def create
    @event = Event.find(params[:event_id])
    @ticket = @event.tickets.create(ticket_params)
    if @ticket.save
        redirect_to [@event, @ticket]
    else
        render 'new'
    end
end

def edit
    @event = Event.find(params[:event_id])
    @ticket= @event.tickets.find(params[:id])
end

def update
    @event = Event.find(params[:event_id])
    @ticket = @event.tickets.find(params[:id])

    if @ticket.update(ticket_params)
        redirect_to [@event, @ticket]
    else
        render 'edit'
    end
end

def destroy
    @event = Event.find(params[:event_id])
    @ticket = @event.tickets.find(params[:id])
    @ticket.destroy
    redirect_to event_tickets_path
end

private

def ticket_params
    params.require(:ticket).permit(:ticket_name, :booking_start_date, :booking_end_date, :ticket_price, :ticket_quantity, :minimum_quantity, :maximum_quantity, :terms_conditions, :more_information, :status)
end

表格部分:

<%= form_for ([@event, @ticket]) do |f| %>
        <%= f.label :ticket_name %>
        <%= f.text_field :ticket_name %>

        <%= f.label :booking_start_date %>
        <%= f.datetime_select :booking_start_date %>

        <%= f.label :booking_end_date %>
        <%= f.datetime_select :booking_end_date %>

        <%= f.label :ticket_price %>
        <%= f.text_field :ticket_price %>

        <%= f.label :ticket_quantity %>
        <%= f.text_field :ticket_quantity %>

        <%= f.label :minimum_quantity %>
        <%= f.text_field :minimum_quantity %>

        <%= f.label :maximum_quantity %>
        <%= f.text_field :maximum_quantity %>

        <%= f.label :terms_contitions %>
        <%= f.text_area :terms_conditions %>

        <%= f.label :more_information %>
        <%= f.text_area :more_information %>
        <%= f.hidden_field :status %>
        <%= f.submit 'Create Ticket' %>

我使用隐藏字段:表单部分中的状态,并且我尝试根据模型方法check_start_date更新要打开或关闭的值。但是,我无法创建或更新故障单,我在故障单控制器中得到No Method Error,未定义方法`check_start_date&#39;。

我哪里错了?使用隐藏字段和模型方法来更新它的状态是正确的方法吗?

3 个答案:

答案 0 :(得分:3)

Ticket 模型中,您有以下回调:

before_create :check_start_date
before_update :check_start_date

这意味着当您创建或更新Ticket对象时,它会将:check_start_date发送到该对象。

您已将check_start_date定义为类方法,但您不希望如此。您希望该方法是实例方法。为什么?好吧,因为该方法需要发送到类Ticket的实例,而不是发送给Ticket本身。

所以,改变:

def self.check_start_date
  if self.booking_start_date == Date.today
    self.update_attribute(:status => 'Open')
  end
end

为:

def check_start_date  
  if self.booking_start_date == Date.today      
    self.status = 'Open'
  end
end

注意:正如@jvnill指出的那样,您应该避免更新一个您甚至不知道它是否在DB中持久存在的对象。我们只需在对象本身中设置属性即可。

答案 1 :(得分:0)

此代码:

def self.check_start_date
  if self.booking_start_date == Date.today
    self.update_attribute(:status => 'Open')
end

定义方法。您需要实例方法。删除self.

def check_start_date
  if self.booking_start_date == Date.today
    self.update_attribute(:status => 'Open')
end

答案 2 :(得分:0)

  1. 您是否需要check_start_date的方法定义中的自我。它看起来像用作实例方法而不是类实例方法。
  2. 此外,您是否要将check_start_date内部的属性更新为数据库或只是设置它?如果您在update_attribute内拨打check_start_date可能会导致无限循环。

    def check_start_date if self.booking_start_date == Date.today self.status = 'Open' end end