具有两个模型未嵌套但链接的简单表单,无法提交



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

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

每个项目都有一个预算,但预算以后可以用于不同的类,所以它不是项目的"子"。

我为表格尝试了不同的东西,这是目前最有效的一种:

<%= 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但是当我这样做时,当我单击"提交"按钮时,没有任何反应。当我单击提交时,使用该版本会出现此错误:

"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

我正在寻找有关简单表单和 rails 编码的良好实践,但我真的找不到与我的案例相关的东西,或者至少我无法识别与我的案例相关的文档。

PS :在我的 rails 控制台中,我有那个输出: 无法创建预算

你的控制器有点笨拙。我会研究脚手架生成器默认生成的创建方法

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


嵌套参数

我确实看到的一件事是,您的参数调用中有问题。

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

这就像说:找到预算的参数"金额"。

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

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

因此,您的参数将像这样嵌套:

params[:project][:budget]

希望对您有所帮助。


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

否则,它将在控制器的第 6 行返回nil

相关内容

最新更新