我有一个Rails 4应用程序。在这个应用程序中,我在各种模型之间具有多个HABTM关系。例如,一项任务可以具有许多学习目标以及与之相关的许多任务。现在,我在模式对话框中有一个编辑表单,用于编辑任务记录,并通过更新记录的edit_task_path(@task)进行调用。我想创建一个新表单,该表单也执行该更新操作;但是,我只希望此表单用于更新任务的关联。我的主要问题是:如何创建和调用第二个表单以路由到同一记录的更新操作?我基本上想要一个update_task_path(@task),它也可以处理更新控制器的动作。我研究了各种堆栈溢出,但没有一个专门针对更新控制器操作提出了一种新的形式。
当您要路由到同一位置时,除了将表单的一部分单独放置之外,您实际上不需要执行任何其他操作。我假设任务在您更改关联时必须是有效的,并且关联将是有效的(或者您没有任何东西可以验证关联的对象),否则在失败时它将呈现主要形式您已放入控制器中。
# 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 %>
对我来说,拥有一个单独的控制器会更干净一些,尤其是如果您只想更新关联而想要不同的行为时。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句