#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