Форма Ruby on Rails: как разделить строку и сохранить ее в виде массива? - PullRequest
0 голосов
/ 04 января 2012

Я новичок в ruby ​​on rails (и StackoverFlow как зарегистрированный участник) Хотя я знаю, что могу разбить строки на myString.split(","), например. Это не проблема.

Что у меня есть:

Динамическое число вложенных полей формы в другой форме, которая пока работает нормально

Что я хочу сделать:

У меня есть Textarea в каждой вложенной форме. Пользователь должен ввести несколько слов, разделенных "," Эти слова должны быть сохранены как Array,, чтобы я мог позже вызвать их через @sector.climbing_routes (как массив).

Прямо сейчас "climbing_routes" - это очень длинная строка.

Как я могу решить эту проблему?

Вот код:

_sector_fields.html.erb (Nested Fields):

    <div class="sector">
    Sektor:
    <table>
        <tr>
            <th><%= f.label :name %></th><th><%= f.label :description %></th><th><%= f.label :climbing_routes %></th>
        </tr>
        <tr>
            <th><%= f.text_field :name %></th>
            <th rowspan="5"><%= f.text_area :description, :rows => 5 %></th>
            <th rowspan="5" ><%= f.text_area :climbing_routes , :rows => 6%></th>
        </tr>
        <tr>
            <th>Bild 1</th>
        </tr>
        <tr>
            <th><%= f.file_field :topo %></th>
        </tr>
        <tr>
            <th>Bild 2</th>
        </tr>
        <tr>
            <th><%= f.file_field :topo2 %></th>
        </tr>
    </table>
</div>

Секторы схемы:

create_table "sectors", :force => true do |t|
t.string   "name"
t.string   "topo"
t.string   "topo2"
t.string   "description"
t.integer  "climbing_area_id"
t.datetime "created_at"
t.datetime "updated_at"
t.string   "climbing_routes"
end

Ответы [ 2 ]

0 голосов
/ 04 января 2012

В вашей схеме базы данных измените climbing_routes со 'string' на 'text'.

В секторе. РБ ...

serialize :climbing_routes

def climbing_routes=( x )
    write_attribute( :climbing_routes, x.split(/ *, */) )
end

В базе данных climbing_routes будет храниться как YAML, а при доступе к нему он будет выглядеть как массив.

Поскольку вы обрабатываете пользовательский ввод, я использовал / *, * /, чтобы разделить данные climbing_routes, чтобы любые лишние пробелы вокруг запятой игнорировались.

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-serialize

0 голосов
/ 04 января 2012

Одна вещь, которую вы можете сделать, это просто сохранить их как список, разделенный запятыми, а затем переписать получатель по умолчанию, который дает вам модель rails:

def climbing_routes
  read_attribute(:climbing_routes).split(",")
end

Или, если вы не собираетесь ВСЕГДА хотетьмассив, и лучше оставить тактовый метод по умолчанию, вы можете создать отдельный метод и вызывать его, когда вам это нужно

def climbing_routes_array
  self.climbing_routes.split(",")
end

Надеюсь, это поможет!

...