Как я могу установить значения параметров контроллера по умолчанию? - PullRequest
0 голосов
/ 23 декабря 2018

В моей базе данных есть таблица клиентов и столбец с именем "last_updated_by".Я хочу добавить имя текущего пользователя в виде обычного текста в этом поле.

В моем приложении установлено устройство, поэтому оно дает мне параметр current_user. Я пытался добавить current_user.name к разрешенным параметрам customer_controllers, но этоне сработало.

1-
def customer_params
params.require(:customer).permit(:name, :last_updated_by=>current_user.name)
end

2-
def customer_params
  params[:last_updated_by] = current_user.name
  params.require(:customer).permit(:name, :last_updated_by)
end

3-
def customer_params
  last_updated_by = current_user.name
  params.require(:customer).permit(:name, :last_updated_by=>current_user.name)
end

Как мне установить некоторые значения по умолчанию в контроллере.

Ответы [ 4 ]

0 голосов
/ 25 декабря 2018

Поскольку метод params.permit используется для фильтрации параметра, с которым вы хотите создать объект, вы можете использовать любое из решений, приведенных выше, но если вы хотите изменить параметры в def customer_params, то я бы хотел изменить ваш2-й раствор

def customer_params
  params[:customer][:last_updated_by] = current_user.name 
  params.require(:customer).permit(:name, :last_updated_by)
end
0 голосов
/ 23 декабря 2018

Если вам нужно значение по умолчанию, только если params[:last_updated_by] отсутствует в теле вашего запроса, вы можете попробовать:

def create
  params[:last_updated_by] = params[:last_updated_by].blank? ? 'Default value' : params[:last_updated_by]
  Customer.new(params)
  # finish your controller method
end

def customer_params
  params.require(:customer).permit(:name, :last_updated_by)
end

Теперь, если вам нужно установить значение по умолчанию при каждом создании иобновить, если last_updated_by равно нулю, вы должны сделать это на модели Customer:

after_save :set_last_updated_by

def set_last_updated_by
  self.last_updated_by = self.last_updated_by.blank? ? 'Default value' : self.last_updated_by
end
0 голосов
/ 23 декабря 2018

Поскольку вы спрашиваете об установке значения по умолчанию, я предлагаю использовать ActionController :: Parameters # with_defaults , который является просто (более выразительным) псевдонимом для ActionController :: Parameters # reverse_merge .

def customer_params
  params
    .require(:customer)
    .permit(:name, :last_updated_by)
    .with_defaults(last_updated_by: current_user.name)
end

Обратное слияние происходит так же, как и обычное слияние, единственное отличие состоит в том, что происходит с конфликтующими ключами.Нормальное слияние использует значение предоставленного хэша, тогда как обратное слияние предпочитает значение исходного хеша над значением предоставленного хеша.

0 голосов
/ 23 декабря 2018

Если вам нужно, чтобы параметр last_updated_by входил в customer_params (хэш-ключ клиента для ActionController::Parameters), тогда:

before_action :set_last_updated_by_param, only: :create

private

def set_last_updated_by_param
  params[:customer][:last_updated_by] = params.dig(:customer, :name)
end

Обратный вызов before_action добавляет новый ключ last_updated_by в customer параметров только перед выполнением действия создания.

Обратите внимание, нет необходимости изменять customer_params, чтобы разрешить его.


Как показывает @JohanWentholt, with_defaults представляетсялучший способ.Пойдите для этого.

Ожидание ОП выбирает правильный ответ.

...