7

Ruby on Rails アプリでオブジェクトの「作成」メソッドを作成するとき、2 つのメソッドを使用しました。コードをよりクリーンで一貫性のあるものにするために、1 つの方法を使用したいと思います。以下に2つの方法をリストします。一方が他方より優れているかどうかは誰にもわかりませんか?もしそうなら、なぜですか?

方法 1:

def create1
  # is this unsecure? should we grab user_id from the session
  params[:venue]['user_id'] = params[:user_id]

  begin
    venue = Venue.create(params[:venue])
    @user_venues = @user.venues
    render :partial => 'venue_select_box', :success => true, :status => :ok
  rescue ActiveRecord::RecordInvalid
    render :text => 'Put errors in here', :success => false, :status => :unprocessable_entity
  end
end

方法 2:

def create2
   # is this unsecure? should we grab user_id from the session
  params[:venue]['user_id'] = params[:user_id]

  venue = Venue.new(params[:venue])
  if venue.save
    @user_venues = @user.venues
    render :partial => 'venue_select_box', :success => true, :status => :ok
  else
    render :text => 'Put errors in here', :success => false, :status => :unprocessable_entity
  end
end
4

4 に答える 4

4
class VenuesController < ApplicationController
  def create
    @venue = @user.venues.create!(params[:venue])
    render :partial => 'venue_select_box', :success => true, :status => :ok
  end

  rescue_from ActiveRecord::RecordInvalid do
    render :text => 'Put errors in here', :success => false, :status => :unprocessable_entity
  end
end

このように使用@user.venuesすると、ユーザー ID が常に適切に設定されます。さらに、ActiveRecord は、呼び出し:user_id中にフィールドが代入されないように保護します。#create!したがって、外部からの攻撃は変更できません:user_id

テストでは、:create への POST を実行すると ActiveRecord::RecordInvalid 例外が発生することを確認できます。

于 2009-04-07T18:23:15.927 に答える
3

私は、日常的な条件には例外を使用すべきではないという考えを持っているので、2 番目の方が優れていると思います。

于 2009-04-07T15:10:55.313 に答える
2

場合によります。すべての create ステートメントが機能すると予想される場合は、前者を使用してください。作成と保存の失敗は例外的であり、プログラムがすぐに回復できない状態になる可能性があるためです。また、リレーショナル整合性 (RedHill Consulting によるforeign_key_migrations) を使用すると、外部キー違反で例外がスローされるため、作成または更新するたびにそれらをキャッチする必要があります。

2 つ目は実行可能であり、その特定のアクションの日常的な操作の一部として、クエリが成功しないことが予想される場合に適しています。

また、セッションが安全でないことについてのコードコメント-セッションはuser_idを置く場所です。他のことを行う前に、ユーザーが認証されていることを確認するためにチェックしている限り、問題はありません。

于 2009-04-07T15:18:33.580 に答える
1

ドンさんの意見に全面的に賛成です。しかし、user_id 部分をさらに一歩進めて、モデルの before フィルターとして設定します。

于 2009-04-07T15:23:35.253 に答える