1

「プロジェクト」表示ページの「新しいスケジュール ステータス」ボタンをクリックすると、単数形のはずのルートが複数形になるエラーが表示されます。これが私のコードです:

# project.rb
class Project < ActiveRecord::Base
  has_one :schedule_status
end

# schedule_status.rb
class ScheduleStatus < ActiveRecord::Base
  belongs_to :project
end

# schedule_statuses_controller.rb
def new
  @project = Project.find(params[:project_id])
  @schedule_status = @project.build_schedule_status
end

# routes.rb
resources :projects do
  resource :schedule_status
end

# _form.html.erb
<%= form_for [@project, @schedule_status] do |f| %>
  ...

form_forエラーは、私の行が間違っていることを知らせてくれます。インスタンス変数は正しく設定されているようですが、エラーは次のとおりです。

undefined method `project_schedule_statuses_path` for ...

アクセスしようとしているルートが複数形である理由は何ですか?

4

2 に答える 2

1

これはバグです。form_for は、オブジェクトの複数形を探します。ただし、単一のリソース :schedule_status を宣言したため、パス ヘルパー メソッドは作成されません。

これを回避するには、form_for に :url パラメータを使用する必要があります。

より明確にするために、この質問/回答を見てください。

于 2012-06-16T00:25:06.100 に答える
0

これはバグではなく機能です(チケットは修正されないためクローズされました):

レールの問題:

https://github.com/rails/rails/issues/1769

要約引用:

このエラーは長い間発生していますが、クリーンなソリューションはすぐには現れません。polymorphic_url ヘルパーは、その動作方法に「知性」を持っていません。routes.rb でリソースとして宣言したものに関する情報はありません。モデルの名前と、それが名前付きの URL ヘルパーにどのようにマップされるかを指定するだけです。

問題は、モデルが単一のリソース URL にマップされているか、通常のリソース URL にマップされているかを識別する簡単な方法がないことです。リソースが :except => :index で指定されている可能性があるため、コレクション URL の存在を確認することはできません。ルート生成エラーを救おうとしても機能しません。形式が id に設定された url であり、例外はありません。

Railsの問題は以前のものを支持してクローズされました: https://github.com/rails/rails/issues/4978

結論

そのような場合は、URL を指定する必要があります。url_for はルートを反映して、それがリソースかどうかを確認できません。

于 2012-06-16T00:46:21.543 に答える