Rails 创建具有父关系的模型
Rails Create model with parent relation
我有两个模型:Schedules
和 Result
。
- 计划
has_one
结果
- 结果
belongs_to
时间表
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 %>
这会将父 schedule
的 id
与您的参数一起传递。另外,请确保您 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。
我有两个模型:Schedules
和 Result
。
- 计划
has_one
结果 - 结果
belongs_to
时间表
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 %>
这会将父 schedule
的 id
与您的参数一起传递。另外,请确保您 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。