Rails 创建具有父关系的模型

Rails Create model with parent relation

我有两个模型:SchedulesResult

Schedules 数据将首先创建,当匹配发生时,我们将为每个 schedule.

创建 results

如上图所示,Create link 会将您带到一个页面,您可以在其中创建计划的结果。我将发送点击 Create 按钮的时间表的 schedule_id

<%= link_to "Create",new_result_url(:schedule_id => schedule.id),{:class => 'btn btn-link btn'}%>

并且在 Results#New

  def new
    @schedule = Schedule.find(params[:schedule_id])
    @result = @schedule.build_result
  end

并且在视图中 results/new.html.erb

这是我卡住或不知道如何提交结果表单的地方 对于我选择的schedule_id

<div class="row">
  <div class="col-md-4">

<%= form_for(@result) do |f| %>
    <h3>Enter the result</h3>
    <%= f.text_area :result,class:'form-control' %><br />
    <%= f.submit "Submit", class: "btn btn-primary" %>
<% end %>
</div>
</div>

在您的表单中,添加:

<%= f.hidden_field :schedule_id, value: @schedule.id %>

这会将父 scheduleid 与您的参数一起传递。另外,请确保您 permit 控制器中的参数 schedule_id

此外,为了更容易将 schedule_id 传递到 results#new 页面,我将 routes 文件更改为:

resources :schedules do
  resources :results
end

这样,到 results#new 页面的路径现在是 new_schedule_result_path(@schedule),您可以在 link_to.

中使用它

编辑:

此外,将您的 form_for 更改为:

<%= form_for[@schedule, @result] do |f| %>

您需要在控制器中定义 @schedule

您可能希望将 result 嵌套在 schedules 下。在您的路线中:

resources :schedules do
  resource :result
end

然后你的控制器看起来像这样:

class ResultsController < ApplicationController
  def create
    schedule.create_result(result_params)
  end

  private

  def schedule
    Schedule.find(params[:schedule_id])
  end

  def result_params
    params.require(:result).permit(:result)
  end
end

这会构建您的应用程序以反映您的实际信息架构,您不必担心通过隐藏字段传递 ID。