目前我的应用程序中有两个模型。
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控制台中,我得到了输出: 无法创建预算
答案 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
。