переменная attr_accessor nil при выполнении обратного вызова before_validation - PullRequest
1 голос
/ 21 октября 2011

Я выполняю before_validation следующим образом:

event.rb

attr_accessor :start_date
attr_accessible :start_time #recorded in database as a datetime

before_validation :build_start_time

...

def build_start_time
  begin
    self.start_time = DateTime.parse(start_date)
  rescue
      errors.add(:start_date, "invalid date")
      return false
  end
end

и контроллер выглядит так:

def create
  @event = events.build(params[:event])
  if @event.save
    # some other method calls
    redirect_to @event
  else
    redirect_to :root
  end
end

start_date устанавливается<% = f.text_field: start_date%> вызывается в представлении формы, и когда я проверяю параметры, они правильно передаются методу «Create» контроллера модели, но в методе build_start_time он равен nil, поэтому self.start_time не устанавливаетсяМожете ли вы объяснить, почему это будет ноль и какое решение будет?Я также попытался назвать его self.start_date, но это не имело значения.

Спасибо

Ответы [ 3 ]

2 голосов
/ 21 октября 2011

Вы пытались сделать start_date также доступным?

1 голос
/ 21 октября 2011

Либо вы вызываете attr_accessible с помощью start_date, чтобы build() мог фактически установить его, либо вы можете изменить свой контроллер на:

def create
  @event = events.build(params[:event])
  @event.start_date = params[:event][:start_date]
  if @event.save
    # some other method calls
    redirect_to @event
  else
    redirect_to :root
  end
end
0 голосов
/ 18 июля 2014

tente assim.

#app/models/adm/video.rb
class Adm::Video < ActiveRecord::Base
  validates :titulo, :url_codigo, presence: true
  before_validation(on: [ :create, :update ]) do
    self.url_codigo = parse_youtube(url_codigo) #url_codigo = params[:adm_video][:url_codigo]
  end

  private
  #  pega só o codigo do link youtube para inserir no banco 
  def parse_youtube(url)
   if !url.blank?
     regex = /(?:.be\/|\/watch\?v=|\/(?=p\/))([\w\/\-]+)/
     return url.match(regex)[1] # https://www.youtube.com/watch?v=iX_rKHnKJSg = iX_rKHnKJSg
   end
 end

end

grava no banco de dosos código do video = iX_rKHnKJSg = https://www.youtube.com/watch?v=iX_rKHnKJSg = iX_rKHnKJSg.

записей в базе данных с кодом iX_rKHnKJSg video = # = https://www.youtube.com/watch?v=iX_rKHnKJSg iX_rKHnKJSg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...