2016-06-26 2 views
0

Я пытаюсь обновить массив, хранящийся в базе данных, однако действие обновления не работает. Массив не обновляется и не отображается ошибка. Другие параметры в форме корректно обновляются в базе данных.База данных Rails не обновляет массив в действии обновления

форма отправляет массив в качестве одного из параметров (в данном случае responses: []):

"task"=> {"title"=>"tasko uno", "responses"=>["yes", "no", "maybe", "other"] ... } 

Обновление действия:

def update 
    @task = Task.find(params[:id]) 
    if @task.update(tasks_params) 
     redirect_to edit_task_path 
    else 
     render 'new' 
    end 
    end 

В PARAMS разрешений:

private 
    def tasks_params 
     params.require(:task).permit(:title, :help, :task_type, :taskflow_id, :responses => []) 
    end 

База данных - это поле sql-lite, а модель задачи - serialize :responses, Array, массив столбцов имеет тип text, с заголовком столбца responses.

Любая помощь будет высоко оценена.

EDIT Миграция файл:

class CreateTasks < ActiveRecord::Migration 
    def change 
    create_table :tasks do |t| 
     t.string :title 
     t.integer :task_type 
     t.text :help 
     t.text :responses 
     t.belongs_to :taskflow 
     t.timestamps null: false 
    end 
    end 
end 

Обновление журнал сервер действий:

Started PATCH "/tasks/1" for 127.0.0.1 at 2016-06-28 12:37:12 +0100 
Processing by TasksController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"BL2fI3JDIGfTqWxQHInR/NFI6N/agETaUb97lAZ86PpNmpj1ofQ+TRkHZNdiISyOMlag3geleig6PsaqaWNr8Q==", "task"=>{"title"=>"tasko uno", "help"=>"some help text", "task_type"=>"2", "taskflow_id"=>"1"}, "responses"=>["test1", "test2"], "commit"=>"Update Task", "id"=>"1"} 
    Task Load (0.1ms) SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" = ? LIMIT 1 [["id", 1]] 
    (0.0ms) begin transaction 
    (0.0ms) commit transaction 
    Taskflow Load (0.1ms) SELECT "taskflows".* FROM "taskflows" WHERE "taskflows"."id" = ? LIMIT 1 [["id", 1]] 
Redirected to http://localhost:3000/taskflows/1/edit 
Completed 302 Found in 3ms (ActiveRecord: 0.2ms) 

Форма - Я пытаюсь иметь форму, добавляющие поля динамически:

<%= bootstrap_form_for @task do |f| %> 
    <%= f.text_field :title %> 
    <%= f.text_area :help %> 
    <%= f.text_field :task_type %> 
    <%= f.hidden_field :taskflow_id, value: @taskflow.id %> 
    <hr> 
    <p><strong>Responses</strong></p> 

    <div class="admin-task-responses"> 
    <% if @task.responses %> 
    <% @task.responses.each do |r| %> 
     <%= render "tasks/task_response", {:res => r} %> 
    <% end %> 
    <% end %> 
    </div> 

    <div class="btn btn-primary add-response-btn"> 
    <span class="glyphicon glyphicon-plus"></span> Add Response 
    </div> 

    <%= f.submit %> 
<% end %> 

Частичное:

<% if local_assigns.has_key? :res %> 
<div class="task-response form-group"> 
    <%= text_field_tag "responses[]", '', :class => 'form-control', :value => res %> 
</div> 
<% end %> 
+0

http://stackoverflow.com/questions/23340222/how-to-save-array-to-database-in-rails? –

+0

@gen Спасибо, но я уже пробовал это - я использую 'serialize: response' в модели и проверил' response' множественное число. Это не ошибка, поэтому мне трудно найти, что происходит. – RobotEyes

+0

Пожалуйста, добавьте свои журналы сервера для действия обновления. Вы знаете, как использовать pry? Вы должны проверить свой объект после обновления. –

ответ

1

Ваш "responses"=>["test1", "test2"] находится вне tasks хэш, но с другой стороны, ваш responses поле является частью модели задач. Скорее всего, в вашей форме вы используете хелпер «..._ tag», чтобы ввести свои ответы, и, следовательно, он не связан с вашим @task, и это является причиной не сохранения или, по крайней мере, для получения каких-либо ошибок.

Если вам нужна дополнительная помощь по этому вопросу, пожалуйста, добавьте форму на вопрос.

ИЛИ, вы можете попробовать следующее, хотя, я бы не рекомендовал его по настройке формы:

params[:task][:responses] = params[:responses] 

Это должно работать для вас:

<%= text_field_tag "task[responses][]", '', :class => 'form-control', :value => res %> 
+0

ahh. Спасибо! Я использую text_field_tag ​​в частичном создании динамической формы, которая добавляет поля по мере необходимости. Я разместил форму, если вы помогли мне сделать это правильно. – RobotEyes

+0

@RobotEyes; Я обновил свой ответ с возможным исправлением для вас. –

+0

Мой герой! Спасибо за всю вашу помощь – RobotEyes

0

будет лучше, если вы сохраните «ответы» в json formate, поэтому закодируйте его в json и при необходимости декодируйте его обратно.

так код будет какая-то вещь, как пыльник

private 
params[:task][:responses] = params[:task][:responses].to_json 
    def tasks_params 
     params.require(:task).permit(:title, :help, :task_type, :taskflow_id, 
     :responses) 
    end 
+0

Спасибо, но, к сожалению, база данных по-прежнему не обновляется – RobotEyes

+0

это может быть так, что вы не добавили это поле в attr_accessor, как и в модели attr_accessor: ответы –

+0

также удалены [] из ответа, это должны быть только: ответы, также, что такое тип данных для этого поля в db? он должен быть строковым, текст .. –

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