0

我想对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 %>

Edit当@goat 记录存在时,它适用于方法,但对于New方法,当控制器给出@goat = Goat.new错误时:

undefined method model_name for NilClass:Class

如何解决这个问题?

4

2 回答 2

1

如果您只想使用相同的 html,只需使用 render :template

def new
  @goat = Goat.new
  render template: 'edit'
end

def edit 
  @goat = Goat.find(params[:id])
end

或更好的方法:在模板edit.html && new.html中使用渲染部分

PS 使用动作“编辑”而不是“新”不是一个好主意,所以如果你查看你的 routes.txt 文件,你会看到动作的路径包括类实例的 :id。

于 2013-04-14T16:03:10.850 回答
1

问题是你实际上并没有@goat为你的 html 设置新的。

在这段代码中:

def new 
    render "edit"
end

这不会调用edit控制器上的方法;相反,它直接进入视图层来渲染edit.html.erb文件。所以设置没有价值@goat,因此你得到的错误。

更好的是像@user2191327 提供的代码。您还应该查看脚手架将为您的控制器生成什么;这是一个很好的指南,了解惯用的 Rails 是什么样子。

于 2013-04-14T16:16:53.217 回答