Simpleform,两个模型没有嵌套但链接,无法提交

时间:2018-01-26 11:57:19

标签: ruby-on-rails ruby activerecord rails-activerecord

目前我的应用程序中有两个模型。

class Budget < ApplicationRecord
    belongs_to :project
end
class Project < ApplicationRecord
    has_one :budget
end

所以每个项目都有预算,但是后期的预算可以用于不同的班级,所以它并不是特别是一个孩子的&#34;一个项目。

我为表单尝试了不同的东西,这是目前最有效的方法:

<%= simple_form_for @project do |f| %>
<%= f.error_notification %>
<%= f.input :name %>
  <%= simple_fields_for @budget do |ff| %>
    <%= ff.input :amount %>
  <% end %>
<%= f.submit "Create", class: "btn" %>
<% end %>

我试图通过simpleform_for替换simple_fields_for但是当我点击&#34;提交&#34;按钮,没有任何反应。 使用该版本,当我单击“提交”时出现此错误:

"undefined method `model_name' for nil:NilClass"

我真的不明白我是不是在这里开展现有课程。

这是我的控制者

def create
respond_to do |format|
  @budget = Budget.new(params.require("budget").permit(:amount))
  if @budget.save # If budget is saved
    puts "Budget successfuly created"
    @project.budget = @budget
    if @project.save
      puts "project successfuly created"
    else
      puts "Unable to create project"
      format.html { render :new, notice: 'Project went wrong' }
    end
    format.html { redirect_to projects_path, notice: 'Success' }
  else # If budget isn't saved
    puts "Unable to create budget"
    format.json { render json: @budget.errors, status: :unprocessable_entity }
    format.html { render :new, notice: 'Budget went wrong' }
  end
end

我正在寻找有关简单形式和轨道编码的良好做法,但我无法找到与我的案例相关的内容,或者至少我无法识别哪些文档与我的相关情况下。

PS:在我的rails控制台中,我得到了输出:     无法创建预算

1 个答案:

答案 0 :(得分:1)

你的控制器有点hacky。我会查看默认的generated create method by the scaffold generater

要了解如何清理它。这意味着更好的调试机会。

嵌套参数

我确实看到的一件事是,你的参数调用出了问题。

@budget = Budget.new(params.require("budget").permit(:amount))

这就像是说:找到参数&#39;金额&#39;预算。

但您的参数由您的表单生成不同:

您有@projects的简单表单,其中包含@budget的简单字段。

因此你的参数将嵌套如下:

params[:project][:budget]

希望它有所帮助。

顺便说一下:你有一个before_action来设置@project吗?

否则会在控制器的第6行返回nil