Как проверить ввод, который зависит от флажка - PullRequest
0 голосов
/ 08 мая 2018

Я недавно начал с рельсов.У меня есть одно задание, но я не знаю, что лучше и как это делать.

У меня есть форма с флажком currency? и вводом currency_code.В базе данных будет храниться только значение currency_code.

Что мне нужно: 1. Если флажок currency? равен TRUE => currency_code должен быть заполнен 2. Если флажок currency? равен FALSE => currency_code будет сброшен на ноль

Как проверить 1. Если currency? нет в базе данных (столбец таблицы), поэтому модель не знает об этом?В случае 2. Где я должен проверить это и сбросить значение currency_code на ноль?

Для случая 2. У меня это есть в моем контроллере, но мне не нравится.Я думаю, что должно быть лучшее решение.

def data_params
  parameters = params.require(:data).permit(
    :currency_code
  )
  parameters[:currency_code] = nil unless params[:data][:currency].to_bool
  parameters
end

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Если вы хотите проверить ввод на уровне модели, вы должны хранить валюту?в базе данных.

Еще скажем по каким-то необъяснимым причинам, что вы не хотите хранить валюту?в вашей базе данных (, которую я не буду предлагать вам в любом случае ).Вы можете определить метод в модели.

def set_currency_if_required is_currency_required
   self.currency_code = nil unless is_currency_required
end

в контроллере

def create
  model = Model.new(data_params)
  model.set_currency_if_required(params[:data][:currency].to_bool)
  model.save
end
...
def data_params
  parameters = params.require(:data).permit(
    :currency_code
  )
end

таким образом вы получите лучшую читаемость и четкое представление о том, что происходит с кодом.

0 голосов
/ 08 мая 2018

Атрибут 'валюта?' которая не является частью модели, называется виртуальными атрибутами. В Rails мы можем использовать виртуальные атрибуты, установив

attr_accessor :currency?

в вашей соответствующей_модели.рб.

Теперь вы можете использовать эту «валюту»? атрибут в вашей форме, как и другие атрибуты модели.

Для случая 2 условие проверки данных такого типа заключается в проверке их в представлении еще до того, как они войдут в модель. Вы должны использовать jquery / javascript или любой другой скрипт на ваш выбор. Здесь я предоставляю фрагмент кода jQuery.

Если вы новичок в использовании jquery в приложении rails, следуйте этому https://github.com/rails/jquery-rails

В вашем form_page.html.erb добавьте идентификаторы к элементам html.

<%= f.check_box :currency?, id: 'currency_checkbox' %>

и

<%= f.text_field :currency_code, id: 'currency_code' %>

Фрагмент jquery

curreny_checkbox = $('#curreny_checkbox')
currency_code = $('#currency_code')

$(currency_checkbox).on('change', function(){
   if(this.checked)
      currency_code.val('2')
   else
      currency_code.val('')
 })  

В вашем контроллере вы можете просто присвоить значения

 def create
  // other codes //
   @obj.currency_code = params[:currency_code]
 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...