#ruby-on-rails
#ruby-on-rails
Вопрос:
Вот проблема, над которой я работал последние несколько дней:
У меня есть модели task и completed_task:
class Task < ActiveRecord::Base
belongs_to :user
has_many :completed_tasks
end
class CompletedTask < ActiveRecord::Base
belongs_to :task
end
У меня есть форма, в которой говорится:
<% @tasks.each do |task| %>
<td><%= link_to task.description, task_path(task) %></td>
<td><%= task.user.first_name %></td>
<td><%= task.value %></td>
<td><%= task.task_type %></td>
<td><%= task.frequency %></td
<td><%= task.active %></td>
<td><%= task.due_by %></td>
<%= button_to "Task Completed", new_completed_task_path(:completed =>[:task_id =>
task.id, :task_value => task.value}) %>
<%end%>
В моем completed_task_controller у меня есть:
def new
@completed_task = CompletedTask.new(params[:completed])
end
def create
@completed_task = CompletedTask.new(completed_task_params)
end
Когда я нажимаю на кнопку для завершения задачи, я хочу, чтобы она создавала запись в таблице completed_tasks, но параметры из родительской таблицы не переходят из нового действия в действие создания. Я предполагаю, что это связано с сильными параметрами, которые я установил как:
private
def set_completed_task
@completed_task = CompletedTask.find(params[:id])
end
def completed_task_params
params.require(:completed_task).permit(:task_id, :task_value)
end
Вот ошибка, которую я получаю:
ActiveModel::ForbiddenAttributesError
Extracted source (around line #19):
def new
@completed_task = CompletedTask.new(params[:completed])
end
Есть идеи???
Комментарии:
1. Разве так не должно быть
@completed_task = CompletedTask.new(params[:completed_task])
? Или, может быть, это должно быть просто@completed_task = CompletedTask.new
.2. Я попробовал оба из них и получил: Неопределенный метод `new’ для nil:NilClass
3. Вы поместили его в
new
действие или куда-то еще?
Ответ №1:
Когда вы вызываете new
метод, в этот момент из формы ничего не было возвращено (оно еще даже не было воспроизведено)
Вы должны просто сделать
def new
@completed_task = CompletedTask.new
end
Когда форма возвращается, тогда create
метод обычно выполняет
def create
@completed_task = CompletedTask.new(completed_task_params)
if @completed_task.save
# stuff to do when the record is saved, maybe redirect to show page or index
else
# stuff to do if record is not saved... probably redisplay new format with errors
end
end
РЕДАКТИРОВАТЬ: чтобы уточнить, метод completed_task_params
(который вы правильно закодировали) по существу помечает атрибуты формы как приемлемые. Если бы вы выполнили CompletedTask.new(params[:completed_task])
строгие параметры, вы были бы недовольны, поскольку атрибуты не были помечены как разрешенные.
Комментарии:
1. Я хотел бы отметить здесь, что важная часть заключается в том, что когда вы вызываете completed_task_params , он возвращает копию хэша параметров, который был помечен как «разрешенный», что позволяет обновлять без
ForbiddenAttributesError
2. @ABMagil, хорошая мысль и более прямое решение вопроса, я отредактирую свой ответ.
3. @DougW, если ответ успешно решит вашу проблему, обязательно отметьте его как принятый (флажок под его оценкой)