3

createRails では、アクションを 2 つの方法で定義します。違いは何ですか?

def create
  @shop = Shop.new(params[:shop])
  if @shop.save
    flash[:success] = 'Thanks for adding new shop.'
    redirect_to @shop
  else
    flash[:error] = 'Error adding review,  please try again.'
    redirect_to @shop
  end
end

# or

def create
  @shop = Shop.create(params[:shop])
  if @shop.save
    flash[:success] = 'Thanks for adding new shop.'
    redirect_to @shop
  else
    flash[:error] = 'Error adding review,  please try again.'
    redirect_to @shop
  end
end

すでに持っていることを考えると:

def new
  @shop = Shop.new
end

どちらがより適切ですか?

4

4 に答える 4

3

このdef newアクションはNewビュー専用です (コントローラーのnewアクションはファイルに対応します)。作成は行いません。Shopapp/views/shop/new.html.erb

def new
  @shop = Shop.new
end

params[:shop]パラメーターがまだ存在しないため、そのアクションには言及されていません-それがNewビューで収集しているものです。

あなたのdef createアクションは、実際にデータベース エントリを作成するアクションです。

def create
  @shop = Shop.new(params[:shop])
  if @shop.save
    flash[:success] = 'Thanks for adding new shop.'
    redirect_to @shop
  else
    flash[:error] = 'Error adding review,  please try again.'
    redirect_to @shop
  end
end

検証を行うことができるように、.new代わりに使用しています。.createまた、Shop.new呼び出しによって実際にレコードが作成されるわけではありません@shop.save

于 2013-01-28T15:28:55.127 に答える
2

最初の方法は、あなたが期待することをしません:

def create
  @shop = Shop.new(params[:shop]) # This won't create a new record on Shops table unless...
  @show.save                      # ...you do this
end

def create
  @shop = Shop.create(params[:shop]) # This will create a new record if everything is fine
  if @shop.save # This is redundant
    # ...
  end
end

createand thenを呼び出すのsaveは冗長です。このcreateメソッドは新しいレコードの作成を試み、検証が成功しない場合は黙って失敗します。一方、save新しいレコードを作成しようとしますが、検証が失敗すると返されるため、 if/elseブロックnilで使用できます。

于 2013-01-28T15:22:16.560 に答える
2

を使用した場合Model.create、オブジェクトを明示的に保存する必要はありません。create メソッドがそれを行います。を使用した場合はModel.new、@object.save を実行してオブジェクトを保存する必要があります。新しい方法はそれを行いません。

Model.new の使用:

def create
  @shop = Shop.new(params[:shop])
   if @shop.save
    flash[:success] = 'Thanks for adding new shop.'
    redirect_to @shop
  else
    flash[:error] = 'Error adding review,  please try again.'
    redirect_to @shop
  end
end

Model.create の使用:

def create
  @shop = Shop.create(params[:shop])
   # if @shop.save (This is not required)
  if @shop 
    flash[:success] = 'Thanks for adding new shop.'
    redirect_to @shop
  else
    flash[:error] = 'Error adding review,  please try again.'
    redirect_to @shop
  end
end
于 2013-01-28T15:31:34.437 に答える
1

createコントローラーアクションでは、にShop.new従わないとダメ@shop.saveです。通常、検証エラーを処理するために、これらの 2 つのステップに分割されています。ユーザーからのデータでショップを開始します。データに問題がなければ、ショップを保存します。検証エラーがある場合は、ユーザーに再試行するよう伝えます。

または、レコードをデータベースに保存する前に、複雑な属性の初期化を行う必要があります。

@user = User.new params[:user]
@user.reputation = fetch_reputation_from_stackoverflow

if @user.save
  # the usual steps here

RE: 質問の編集

すでに持っていることを考えると:

def new
  @shop = Shop.new
end

何が実際に行われているかは、newまったく無関係です。検証が失敗する可能性がある場合 (または、モデルが正常に作成されない可能性がある場合)、new+saveペアを使用します。入力データに問題がなく、モデルが常に保存されることが確実な場合は、のみを使用してくださいcreate(以下saveは冗長です)。

于 2013-01-28T15:21:40.533 に答える