ruby-on-rails - 带有嵌套资源轨的嵌套表单 4

标签 ruby-on-rails forms ruby-on-rails-4

我正在尝试在 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 个模型,LabStageTask,每个模型都通过 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/

相关文章:

ruby - Rails - ActiveAdmin 未在菜单中显示新资源

css - Surveyor gem 破坏了我的 CSS

ruby-on-rails - 我应该使用哪些 gem 组合来测试我的 Rails 项目?

javascript - pikaday 日期未从 php 表单发送

javascript - Rapidmail 订阅表格在电子邮件订阅后重定向 - Mailchimp

ruby-on-rails - 图像路径生产引用在 Rails 4 中不起作用

ruby-on-rails - Rails 生产路线问题

ruby-on-rails - rbenv:没有这样的命令 "install"即使安装了 ruby​​-build

ruby-on-rails - 使用 Elasticsearch/Tire 展平多态 AR 关系

javascript - 将 HTML 输入值传递给 jQuery 表单值