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

@goat問題は、実際にはhtmlに new を設定していないことです。

このコードでは:

def new 
    render "edit"
end

editこれはコントローラーのメソッドを呼び出しません。代わりに、ビュー レイヤーに直接移動してedit.html.erbファイルをレンダリングします。したがって、set の値がない@goatため、エラーが発生します。

@ user2191327 が提供したようなコードの方が優れています。scaffold がコントローラー用に生成するものも確認する必要があります。慣用的な Rails がどのように見えるかについての良いガイドです。

于 2013-04-14T16:16:53.217 に答える
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 で render partial を使用します

PS 'new' の代わりにアクション 'edit' を使用するのは良い考えではないため、routes.txt ファイルを見ると、アクションへのパスにクラス インスタンスの :id が含まれていることがわかります。

于 2013-04-14T16:03:10.850 に答える