我正在使用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;。
我哪里错了?使用隐藏字段和模型方法来更新它的状态是正确的方法吗?
答案 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)
check_start_date
的方法定义中的自我。它看起来像用作实例方法而不是类实例方法。此外,您是否要将check_start_date
内部的属性更新为数据库或只是设置它?如果您在update_attribute
内拨打check_start_date
可能会导致无限循环。
def check_start_date
if self.booking_start_date == Date.today
self.status = 'Open'
end
end