2014-09-14 2 views
2

Я новичок в Rails, и у меня возникают некоторые проблемы с Simple_Form, Devise и checkboxes.Rails Simple_Form Несколько флажков выбора

Я добавил несколько дополнительных столбцов в мою модель Devise, включая столбец, где я бы хотел, чтобы пользователи отмечали один или несколько флажков. Подобно этому:

Области работы: [] Англия [] Wales [] Шотландия

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


Вот мой Посмотреть код [приложение/просмотров/изобретают/регистрация/edit.html.erb]:

<%= simple_form_for(resource, html: { class: 'form-horizontal'}, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %> 

<%= f.input :areas, :as => :check_boxes, :collection => ["England", "Wales", "Scotland", "Northern Ireland"] %> 

<% end %> 

А вот мои ApplicationController код [приложение/контроллеры /application_controller.rb]:

class ApplicationController < ActionController::Base 
protect_from_forgery with: :exception 

before_filter :configure_permitted_parameters, if: :devise_controller? 

protected 

def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:sign_up) << :areas 
    devise_parameter_sanitizer.for(:account_update) << :areas 
end 
end 

Я уверен, что мне не хватает чего-то очевидного, но я долгое время работал в Google.

Любая помощь была бы принята с благодарностью!


EDIT:

Извинения. Вот схема для Devise (на самом деле назвали «провайдер») таблицы:

create_table "providers", force: true do |t| 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0, null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "first_name" 
    t.string "last_name" 
    t.string "organisation" 
    t.string "street" 
    t.string "city" 
    t.string "county" 
    t.string "postcode" 
    t.string "areas" 
    t.string "methods" 
end 

add_index "providers", ["email"], name: "index_providers_on_email", unique: true 
add_index "providers", ["reset_password_token"], name: "index_providers_on_reset_password_token", unique: true 
+0

Вы предоставили слишком мало информации. Какова ваша схема db (что означает, что области представлены в базе данных) ?. – Lucas

+0

Является ли 'areas' ассоциацией? – kobaltz

+0

@ Лукас - извинения. Я обновил свой вопрос, чтобы включить схему. – diferse

ответ

1

Есть много способов сэкономить области,

1) Лучший способ заключается в создании новой модели под названием площади и имеет многочастичным to-many с пользователем. check. Это базовое приложение, в котором пользователь имеет множество аскокций проектов.

2) Если вы не хотите создавать отдельную модель области, вы можете сохранить область в одном из столбцов пользователя. Либо вы можете serialize столбец. Здесь вы можете хранить данные в форме arr или хеша

3) Добавьте перед фильтром пользователя и перед тем, как сохранить пользователя, соедините области и сохраните их как строку.

+0

Привет @bunty. Спасибо за ваш ответ. Я думаю, что (1) может быть так, как я должен идти. Что касается (2) и (3), я должен создать свой собственный контроллер для разработки, [похожий на это решение] (http://stackoverflow.com/questions/3546289/override-devise-registrations-controller)? – diferse

+0

Не требуется. При создании данных программа Devize сохранит ваши области в формате сериализации. Для (3) вам нужно создать перед сохранением метод в пользовательской модели, где вы можете передать массив областей, присоединиться к нему с запятыми и установить его в поле областей. – bunty

+0

Простите меня - я очень новичок в Rails.Не могли бы вы дать мне демо-код для модели? Я очень благодарен за вашу поддержку. – diferse

Смежные вопросы