#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):
check_started_at’
app/models/order/signed.rb:20:in
Комментарии:
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