编辑和新方法的相同形式

时间:2013-04-14 15:56:22

标签: ruby-on-rails

我想为EditNew方法使用相同的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

如何解决这个问题?

2 个答案:

答案 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的惯用语。