Массив не сохраняется в базе данных

#ruby-on-rails #arrays #postgresql #devise #params

#ruby-on-rails #массивы #postgresql #разработать #параметры

Вопрос:

Я пытаюсь сохранить массив (:vehicles) в своей базе данных. Этот массив состоит из 3 возможных транспортных средств, которые пользователь выбирает с помощью флажков.

 <% @vehicles.each_with_index do |vehicle,index| %>
    <label>
      <div >
        <%= check_box_tag "vehicles[]", index ,class: "available" ,style: "display:none" %>
        <%= vehicle %>
      </div>
    </label>
<%end %>
  

Тип атрибута ‘: vehicles’ — ‘text’, и я использовал этот код, чтобы сделать его массивом:

 serialize :vehicles, Array
  

Если я отправлю параметры, он получит эти значения в массиве.

 "vehicles"=>["0", "1", "2"],
"commit"=>"Sign up!", 
"controller"=>"registrations", 
"action"=>"create"
  

Проблема в том, что этот массив не сохраняется в базе данных, когда я пытаюсь его сохранить. В базе данных код выглядит следующим образом:

 vehicles: []
  

Код контроллера:

  def create
    @student = Student.create(student_params)
    if @student.save!
      redirect_to @student
    else
      render :new
    end
  end
  

Параметры учащихся:

 def student_params
    params.require(:student).permit(availabilities_attributes: [ :id, :day, :available])
  end
  

У кого-нибудь есть идея, как получить эти значения в этот массив?

Спасибо!

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

1. разрешаете ли вы атрибут массива транспортных средств в строгих параметрах вашего контроллера?

2. Опубликуйте свое действие создания

3. @Ren Да, def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) << [:vehicles] end

4. пожалуйста, не публикуйте код в комментариях. слишком сложно читать. вместо этого обновите исходное сообщение.

5. Почему бы не использовать столбец ARRAY типа для хранения этих данных? Postgres поддерживает это, и это фантастика.

Ответ №1:

В ваших строгих параметрах вам нужно будет разрешить :vehicles атрибут в виде массива, например: vehicles: []

Я не уверен, какую версию Devise вы используете, но, исходя из их документации, в разделе «строгие параметры», вы могли бы разрешить vehicles подобное в контроллере приложения:

 def configure_permitted_parameters
  devise_parameter_sanitizer.permit(:sign_up) do |student_params|
    student_params.permit({ vehicles: [] }, :email, :password, :password_confirmation)
  end
end
  

Также, если вы используете базу данных Postgres, я рекомендую настроить ваш vehicles атрибут для получения массива непосредственно в базе данных. Вы можете сделать это с помощью миграции, подобной этой:

 class AddArrayToStudents < ActiveRecord::Migration
  def change
    add_column :students, :vehicles, :string, array: true, default: []
  end
end