1

Rails での最初の大きなプロジェクトに取り組んでいます。RESTful API になります。私が遭遇した状況は、次のように説明できます。モデル「人」と「アプリケーション」があります。

class Person < ActiveRecord::Base
  has_many :managed_applications, :class_name => "Application", :foreign_key => "manager_id"
  has_many :owned_applications, :class_name => "Application", :foreign_key => "owner_id"

  # other associations
  has_many :adresses
end

class Application < ActiveRecord::Base
  belongs_to :manager, :class_name => "Person"
  belongs_to :owner, :class_name => "Person"
end

以下のわかりやすいリソースが機能するように、コントローラーとルートをどのように設計すればよいですか?

/applications/<id>/owner
/applications/<id>/manager
/people/<id>

問題は、「複数の」アプリケーション リソースの下に単一の所有者と管理者のリソースがネストされている場合、すべてのルートが同じパラメータを持つ同一の「PeopleController」アクションになることです。

ボーナスは、最初の 2 つのリソースが読み取り専用操作に関して最後のリソースとして機能する場合です (たとえば、特定のアプリケーションのマネージャーのアドレスを 'GET /applications/<id >/所有者/アドレス')。それも推奨される API 設計ですか?

どうもありがとう。

4

1 に答える 1

1

確かに有効な REST アプローチだと思いますが、1 レベル上のアドレスの深いネストを削除します。そうすれば、人々はそれ自体が浅いリソースになり、独自のアドレスを持つことになります。これを行うのは、1 を超えるレベルの REST ネストが推奨されないためです。http://guides.rubyonrails.org/routing.htmlを参照してください。では、もう 1 つの問題に取り組みましょう。コントローラーは、ユーザーが「所有者」または「管理者」を要求したことをどのように認識しますか。1 つの方法は、次のようにルートでデフォルト パラメータを使用することです。

resources :applications do
  resource :owner, :controller => 'people', :defaults => {:type => 'owner'}
  resource :manager, :controller => 'people', :defaults => {:type => 'manager'}
end

resources :people do
  resources :address
end

次に、PeopleController で:

class PeopleController < ApplicationController
  def show
    @type = params[:type] # can be manager, owner or nil
  end
end

ただし、ここではユーザーが URL でこれらのデフォルト パラメータを上書きできることに注意してください。そのため、セキュリティへの影響はあなたに任せます。

もう 1 つの方法は、完全な URL アドレスを生成する request.fullpath を確認することです。その中で、マネージャーまたは所有者のいずれかを検索できます。

幸運を!

于 2012-05-26T14:50:45.290 に答える