Атрибут условного включения - метод create - Rails 5 - PullRequest
0 голосов
/ 21 мая 2018

Каков наилучший способ условного включения атрибута в create (или любой метод method(attr, attr, attr) стиля)?

@user = User.find_by_name("Sam") # <- might not exist

Store.create(
  name: "Some Store",
  email: "store@example.com",
  user_id: @user.id if @user.present? # <- CONCEPT ONLY - Should be added if condition is true to prevent error
)

, строка user_id: @user.id выдает ошибку, если @userне был найден и поэтому nil.

Ответы [ 2 ]

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

Самое минимальное изменение, которое я мог бы сделать, чтобы ваш код работал:

Store.create(
  name: "Some Store",
  email: "store@example.com",
  user_id: @user&.id
)

При этом используется оператор безопасной навигации (&.) для "игнорирования вызовов методов" для значений nil.

Однако, почему вы выбираете объект с нулевым значением, а затем пытаетесь вызвать для него метод?Учитывая контекст вашего исходного поста, вы можете вместо этого просто сделать:

Store.create(
  name: "Some Store",
  email: "store@example.com",
  user: @user
)

Это будет работать нормально, независимо от того, существует @user.

... Или, возможно,даже то, что вы действительно намерены сделать, это что-то вроде:

Store.create(
  name: "Some Store",
  email: "store@example.com",
  user: User.find_or_create_by(name: 'Sam')
)
0 голосов
/ 21 мая 2018

Вы забыли, что аргумент .create() является ярлыком для хэша.Сделайте хеш явным:

hash = {
  name: "Some Store",
  email: "store@example.com"
} 
hash[:user_id] = @user.id if @user.present?
Store.create(hash)

Другой вариант - передать .create блок:

Store.create do |s|
  s.name = "Some Store"
  s.email = "store@example.com"
  s.user_id = @user.id if @user
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...