Как получить дату из «date_select» и проверить ее?

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Я новичок в ruby. Я хочу получать даты из форм и проверять их в подклассах, но я не знаю, как их реализовать. Может быть, я не знаю, как получить даты из хэша. Пожалуйста, помогите мне.

 # HTML
<%= form_with model: @order, scope: :order, url: update_signed_in_show_employer_url(order.employer, order_id: order.id) , method: :put, class: '' do |f| %>
  <div class="form-group">
    <label>start date:</label>
    <% if order.signed_at.present? %>
    <%= f.date_select :started_at, {default: order.signed_at}, { class: 'form-control m-b' } %>
    <% end %>
  </div>
<% end %>
 
 # controller
def update_signed_in_show
  @employer = Employer.find(params[:id])
  logger.debug "singned_params: #{signed_params}"
  @order = Order::Signed.find(params[:order_id])

  ......
end
 
 # class Order::Signed < Order
validate :check_started_at
def check_started_at
  if self.started_at.present? amp;amp; self.ended_at.present?
    if self.started_at.to_datetime < self.signed_at.to_datetime
      errors.add :started_at, 'xoxoxoxoxo.......'
    end
  end
end
 

В контроллере я могу прочитать параметры в форме.
хэш:
{«started_at (1i)»=>»2019», «started_at (2i)»=>»4», «started_at (3i)»=>»17», «ended_at (1i)»=>»2022», «ended_at (2i)»=>»4», «ended_at (3i)»=> «17», «remark_of_signed»=>»», «статус» =>»подписан»}

Я хотел проверить в подклассах, но получил сообщение об ошибке:

NoMethodError (неопределенный метод to_datetime' for nil:NilClass):
app/models/order/signed.rb:20:in
check_started_at’

Комментарии:

1. Вы никогда не присваиваете параметры, которые вы получаете в контроллере, модели в предоставленном вами коде. При проверке модели вы проверяете, присутствуют ли started_at и ended_at, но затем сравниваете started_at и signed_at . signed_at равно нулю и выдает ошибку. Если вы просто присвоите хэш атрибутам модели, rails проанализирует хэш до нужного вам значения datetime, после этого не нужно вызывать .to_datetime для него.

2. Спасибо за ваш ответ. Я использовал метод, который вы предоставили для достижения цели. Еще раз спасибо.

Ответ №1:

Благодаря Siim Liiser за его помощь я смог успешно ее проверить.

 # Order::Entered < Order
validate :check_ended_at

def check_ended_at
  if self.started_at.present? amp;amp; self.ended_at.present?
    if self.ended_at < (self.started_at   signed_years_count.year)
      errors.add :started_at, 'error message...'
    end
  end
end