экземпляр модели self.booleanclaas_value не сохраняет значение, если его логический

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Я работаю над проектом Rails, и у меня возникли проблемы с сохранением логического значения. Отлично работает, если это строка.

Вот более короткая версия модели

 require 'active_record'

# Public: Class representing data
class RandomClass
  include ActiveModel::Serializers::JSON

  # Public: Returns boolean hopefully
  attr_accessor :why_does_this_not_work

  def initialize(values = {})
    @why_does_this_not_work = values[:why_does_this_not_work]
  end

  def update_with(new_data)
    self.why_does_this_not_work = new_data.why_does_this_not_work || why_does_this_not_work
  end
  

Когда значение why_does_this_not_work инициализируется, оно устанавливается в логическое значение, но когда update_with вызывается с new_data , хотя значение существует, присвоение не работает.

self.why_does_this_not_work = true сохраняется, но когда я делаю self.why_does_this_not_work = new_data.why_does_this_not_work || why_does_this_not_work или self.why_does_this_not_work = new_data.why_does_this_not_work значение не сохраняется.

То же самое с why_does_this_not_work , значение сохраняется при его инициализации, но оно ничего не возвращает при вызове.

Все вышеперечисленное работает нормально, если вместо этого передается строка.

Я предполагаю, что это может быть как-то связано с логическими значениями в ruby. Я попытался посмотреть на класс, и значение возвращается как TrueClass или FalseClass

Любая помощь была бы оценена. Я не уверен, сыграет ли добавление кода контроллера какую-либо роль.

Env:

 Ruby: 2.6.2,
Rails: 5.2.4.3
  

Ответ №1:

Это не работает, когда new_data.why_does_this_not_work установлено значение false? || Оператор проигнорирует его, если это false .

 false || true # => true
  

Как насчет того, чтобы попробовать

 def update_with(new_data)
  new_value = new_data.why_does_this_not_work.nil? ? why_does_this_not_work : new_data.why_does_this_not_work
  self.why_does_this_not_work = new_value
end

  

Это будет принимать любое значение new_data , если оно не равно нулю. Затем он вернется к существующему значению.

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

1. Жаль, что я не сделал этот пост 2 дня назад. Спасибо. Ruby — это много магии, которую я пытаюсь изучить.