我有一个Rails 4应用程序。在这个应用程序中,我在各种模型之间有多个HABTM关系。例如,任务可以有许多学习目标以及与之相关的许多任务。现在,我在模态对话框中有编辑表单,编辑任务记录,并通过更新记录的edit_task_path(@task)调用。我想创建一个新的表单来执行更新操作;但是,我只希望这个表单用于更新任务的关联。我的主要问题是:如何创建并调用第二个表单以路由到同一记录的更新操作?我基本上喜欢update_task_path(@task)来处理更新控制器操作。我已经查看了各种堆栈溢出,没有专门针对更新控制器操作的新表单。
答案 0 :(得分:1)
当您路由到同一个地方时,除了单独的单独表格之外,您不需要做任何其他事情。我假设任务必须在您更改关联时有效,并且关联将是有效的(或者您没有任何东西来验证关联对象)否则在失败时它将呈现主窗体,如果这是什么你已经放入了控制器。
# main_form
<%= form_for @task do |f| %>
<div class="field">
<%= f.label :name %>
<%= f.text_field :name %>
</div>
<% end %>
# mission_and_learning_objective_form
<%= form_for @task do |f| %>
<div class="field">
<%= f.collection_check_boxes :mission_ids, Mission.all, :id, :name %>
</div>
<div class="field">
<%= f.collection_check_boxes :learning_objective_ids, LearningObjective.all, :id, :name %>
</div>
<% end %>
你可能会考虑使用单独的控制器,但
路线
resources :task_settings, only: [:edit, :update]
控制器
class TaskSettingsController < ApplicationController
def edit
@task = Task.find(params[:id])
end
def update
@task = Task.find(params[:id])
if @task.update(task_setting_params)
redirect_to @task, notice: "Settings Updated"
else
render :edit
end
end
private
def task_setting_params
params.require(:task).permit(mission_ids: [], learning_objective_ids: [])
end
end
查看
# task_settings/edit
<%= form_for @task, url: task_setting_path(@task) do |f| %>
<div class="field">
<%= f.collection_check_boxes :mission_ids, Mission.all, :id, :name %>
</div>
<div class="field">
<%= f.collection_check_boxes :learning_objective_ids, LearningObjective.all, :id, :name %>
</div>
<% end %>
对于我来说,拥有一个单独的控制器会更加清晰,特别是如果你只想更新关联,你会想要不同的行为。