在Rails 4中更新记录的新表单

时间:2016-03-23 12:07:11

标签: ruby-on-rails ruby-on-rails-4

我有一个Rails 4应用程序。在这个应用程序中,我在各种模型之间有多个HABTM关系。例如,任务可以有许多学习目标以及与之相关的许多任务。现在,我在模态对话框中有编辑表单,编辑任务记录,并通过更新记录的edit_task_path(@task)调用。我想创建一个新的表单来执行更新操作;但是,我只希望这个表单用于更新任务的关联。我的主要问题是:如何创建并调用第二个表单以路由到同一记录的更新操作?我基本上喜欢update_task_path(@task)来处理更新控制器操作。我已经查看了各种堆栈溢出,没有专门针对更新控制器操作的新表单。

1 个答案:

答案 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 %>

对于我来说,拥有一个单独的控制器会更加清晰,特别是如果你只想更新关联,你会想要不同的行为。