目前我的应用程序中有两个模型。
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
。