2013-08-05 4 views
0

У меня есть текстовое поле в моей базе данных, называемое отделами, где я хочу хранить список отделов. Пользователь вводит название отделов с разделением запятой. Например:Получите значение из текстового поля и сохраните его как массив

department1, deaprtment2, department3 

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

EDIT: Я добавил это к моей модели:

class Org < ActiveRecord::Base 
    serialize :department, Array 
    attr_accessible :name, :department 
    before_validation :update_department 
    validates :name, presence: true 
    def update_department 
    if department_changed? and department.is_a?(String) 
     self.department = self.department.split(',').collect(&:strip) 
    end 
    end 
end 

и вид:

<%= f.text_area :department, :cols => "10", :rows => "10" %> 

Теперь Всякий раз, когда я пытаюсь зарегистрироваться, поле отдел уже есть [] присутствует, и когда я пытаюсь обновить отдел, уже ["[department1", "department2]"].

Я хочу, чтобы [] удалялась при регистрации и только отдел1, отдел2 отображался при обновлении.

Пожалуйста, помогите.

+1

Вы должны 'сериализации: отделы, Array' (http://stackoverflow.com/questions/4711334/string-to-serialized-array) – MrYoshiji

+0

@MrYoshiji: Я редактировал мой вопрос. Не могли бы вы предложить какое-то дальнейшее решение? – sushilthe

ответ

1

Лучший способ сделать это будет через ваши модели. Я предполагаю, что у вас есть модель под названием Org, а другая называется Department и что вы определили, что у нее много отношений между ними. Все, что вам тогда нужно сделать, это в вашей модели Org добавьте следующий код:

def department_list 
    departments.collect { |d| d.department_name }.join(', ') 
    end 

    def department_list=(text) 
    if id && text 
     departments.destroy_all 
     text.split(',').each do |d| 
     departments.create(department_name: d.strip.capitalize) 
     end 
    end 
    end 

Затем на ваш взгляд, добавить текстовое поле с помощью @ org.department_list.

EDIT:

Основываясь на своем развернутом вопрос, у вас есть поле отдела в модели орг, который вы хотите хранить и показывать как массив и редактировать, но в качестве простого текстового поля. Мои мысли по этому поводу заключались в том, что мне не нравится идея хранения данных отдела в области в org, это отношение от одного до многих, поэтому отдел должен быть отдельной моделью. Я бы удалил поле отдела из org. Затем создайте миграцию, чтобы создать таблицу разделов. Это должно выглядеть примерно так:

class CreateDeparments < ActiveRecord::Migration 
    def change 
    create_table :departments do |t| 
     t.integer :org_id 
     t.string :department_name 

     t.timestamps 
    end 
    end 
end 

Далее в модели отдела добавить следующую строку кода:

belongs_to :org 

В модели орг добавить следующее:

has_many :departments, dependent: :destroy 

    def department_list 
    departments.collect { |d| d.department_name }.join(', ') 
    end 

    def department_list=(text) 
    if id && text 
     departments.destroy_all 
     text.split(',').each do |d| 
     departments.create(department_name: d.strip.capitalize) 
     end 
    end 
    end 

В контроллерах и теперь у вас есть следующие данные:

@org = Org.first 
# List of departments as an array for a select 
@org.departments 
# A comma separated string for text boxes 
@org.department_list 

Теперь метод department_list можно использовать для отображения списка в текстовом поле, а также для публикации и изменения.Таким образом, вы ваш взгляд код становится просто это:

<%= f.text_area :department_list, :cols => "10", :rows => "10" %> 

Вы, возможно, потребуется изменить ваш контроллер орг, изменяя создать что-то вроде этого:

def create 
    @org = Org.new(params[:org]) 

    respond_to do |format| 
     if @org.save 
     @org.department_list = params[:org][:department_list] 
     format.html { redirect_to org_url, 
         notice: "#{@org.name} was successfully created" } 
     format.json { render json: @org, 
         status: :created, location: @org } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @org.errors, status: :unprocessable_entity } 
     end 
    end 
end 

Если вы все еще застряли у меня есть полный webiste на github, с которым вы можете ознакомиться. Для вас это организации и отделы, а на mysite это люди и навыки, люди и кредиты. Это ссылка:

https://github.com/davesexton/CKCASTING

+0

На самом деле у меня есть поле отдела внутри моей модели, называемой org. Что я должен изменить? – sushilthe

+0

Обновлено мой ответ –

+0

При отображении формы регистрации появляется следующая ошибка: 'uninitialized constant Org :: Department' – sushilthe

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