我想为Edit
和New
方法使用相同的html表单。
控制器方法:
def new
render "edit"
end
def edit
if params[:id].present?
@goat = Goat.find(params[:id])
else
@goat = Goat.new
end
end
Edit
表格:
<% form_for @goat do |f| %>
<%= f.text_field :title %>
<%= f.submit "Update" %>
<% end %>
当@goat记录存在时,它适用于Edit
方法,但对于New
方法,当控制器提供@goat = Goat.new
时,我收到错误:
undefined method model_name for NilClass:Class
如何解决这个问题?
答案 0 :(得分:1)
如果你只想使用相同的html,只需使用render:template
def new
@goat = Goat.new
render template: 'edit'
end
def edit
@goat = Goat.find(params[:id])
end
或更好的方法:在模板中使用render partial&amp;&amp; new.html
P.S。使用动作&#39;编辑&#39;相反,&#39; new&#39;不是一个好主意,所以如果你查看routes.txt文件,你会看到行动路径包括:类实例的id。
答案 1 :(得分:1)
问题是你实际上没有为你的html设置新的@goat
。
在此代码中:
def new
render "edit"
end
这不会调用控制器上的edit
方法;相反,它直接进入视图层以呈现edit.html.erb
文件。所以@goat
设置没有价值,因此你得到的错误。
更好的是像@ user2191327提供的代码。您还应该看看脚手架会为您的控制器生成什么;这是一个很好的指导Rail的惯用语。