我正在尝试在 Rails 4.0.3 上创建一个带有嵌套资源的嵌套 form_for 但是我遇到了一些问题并且花了很多时间。
问题是当我尝试提交表单时,这些值没有保存在我的数据库中。它将直接通过 labs#index
我已经定义了嵌套资源和labs_controller
,如下所示。
路线.rb
...
resources :users do
resources :labs
end
labs_controller.rb(部分)
class LabsController < ApplicationController
load_and_authorize_resource
def new
@user = User.find(params[:user_id])
@lab = Lab.new
end
def create
@lab = Lab.new(lab_params)
if @lab.save
flash[:notice] = "Successfully created lab."
redirect_to user_labs_url
else
render :action => 'index'
end
end
private
def lab_params
params.require(:lab).permit(:title, :description,
stages_attributes: [:id, :lab_id, :description,
tasks_attributes: [:id, :stage_id, :detail, :instruction, :answer ]])
end
end
我有 3 个模型,Lab
、Stage
和 Task
,每个模型都通过 has_many
关系链接。我还使用 CanCan
来处理授权。
lab.rb
class Lab < ActiveRecord::Base
belongs_to :user
has_many :stages
resourcify
validates :user_id, presence: true
accepts_nested_attributes_for :stages
end
stage.rb
class Stage < ActiveRecord::Base
belongs_to :lab
has_many :tasks
resourcify
accepts_nested_attributes_for :tasks, allow_destroy: true
end
任务.rb
class Task < ActiveRecord::Base
belongs_to :stage
resourcify
end
这是我的部分表单。
_form.html.erb
<%= form_for [@user, @lab] do |f| %>
<div class="field">
<%= f.label :title %>
<%= f.text_field :title %>
<%= f.label :description%>
<%= f.text_area :description %>
</div>
<%= f.fields_for :stages do |builder| %>
<%= render "labs/partials/stage_fields", f: builder %>
<% end %>
<div><%= f.submit "Submit", class: "btn btn-primary" %></div>
<% end %>
_stage_fields.html.erb
<fieldset>
<%= f.label :description %>
<%= f.text_area :description %>
</fieldset>
<%= f.fields_for :tasks do |builder| %>
<%= render "labs/partials/task_fields", f:builder %>
<% end %>
_task_fields.html.erb
<fieldset>
<%= f.label :detail %>
<%= f.text_area :detail %>
<%= f.label :instruction %>
<%= f.text_area :instruction %>
<%= f.label :answer %>
<%= f.text_field :answer %>
</fieldset>
我已经解决了几个问题,但没有一个对我有用。例如。
我也尝试在嵌套模型表单上关注 Ryan Bates,但仍然没有成功。希望有人能帮助我。
提前致谢!
最佳答案
查看错误日志,可能是您的 lab_params
函数存在问题。当您查看传入的参数时,您希望将这些参数与您的允许选项相匹配。然后查看strong params有关如何处理嵌套参数的指导文档。
def lab_params
params.require(:lab).permit(:title, :description,
:stage => [:id, :lab_id, :description,
:tasks => [:id, :stage_id, :detail, :instruction, :answer ]
]
)
end
我认为这应该能让你超越这个错误。
关于ruby-on-rails - 带有嵌套资源轨的嵌套表单 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24173836/