Rails使用父关系创建模型

时间:2015-04-15 02:11:48

标签: ruby-on-rails nested-forms

我有两个模型:SchedulesResult

  • 安排has_one结果
  • 结果belongs_to时间表
首先会创建

Schedules数据,当匹配发生时,我们会为每个results创建schedule

enter image description here

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

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

结果#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>

2 个答案:

答案 0 :(得分:3)

您可能希望在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。

答案 1 :(得分:1)

在表单中,添加:

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

这将通过您的参数传递父id的{​​{1}}。另外,请确保在控制器中schedule 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| %>