1

私はまだレールのコツをつかもうとしています。データを入力して送信すると、データベースに保存されるフォームを使用して、簡単なアプリを作成しようとしています。新しいプロジェクトを開始してから実行することで、これは非常に簡単になりました。

$ rails generate scaffold RSVP firstName:string lastName:string

フォームから新しいレコードを追加した後、ありがとうページにリダイレクトしたいと思います。

以下のメソッドをrsvps_controller.rbファイルに手動で追加しました。

# GET /rsvps/thank_you
  def thank_you
    respond_to do |format|
      format.html # thank_you.html.erb
      format.json { render json: @rsvps }
    end
  end

この行は私のルートファイルにあります:

resources :rsvps 

私の質問は、rakeルートを実行すると、thank_youメソッドのルートが表示されないことです。私の:rsvpsリソースは私のthank_youルートを取得するべきではなく、ルートはどのコントローラーメソッドがどのhttp呼び出し(get、post、putなど)であるかをどのように知るのですか?

4

5 に答える 5

6

コントローラでそのアクションにヒットするルートを取得するには、routes.rbファイルに次のようなものを含める必要があります。

resources :rsvps do
  member { get :thank_you }
end

また

resources :rsvps do
  collection { get :thank_you }
end

作成したばかりのリソースにアクセスするかどうかによって異なります。

@ http://guides.rubyonrails.org/routing.htmlを見ると、ルーティングメカニズムをよりわかりやすく説明するのに役立ちます。

于 2012-07-13T00:53:18.840 に答える
3

wladが言ったことに加えて、routes.rbファイルのresources:rsvpsは、ほとんどのモデルで必要となるデフォルトルートのセットを作成します。インデックス、新規、作成、表示など。thank_youアクションがレーキルートに表示されない理由は、thank_youがあまりにも一般的なアクションの1つではないため、追加のコードなしですぐに含める必要があるためです。

于 2012-07-13T03:21:35.630 に答える
2

ありがとうページにrsvpモデルをロードして、そのモデルのデータを表示する必要がある場合は、メンバールートを使用する必要があります。ルートの:idは、これがリソースメンバールートであり、特定のリソースに関連付けられている必要があるため、そこにあります。何をロードするかを知るには、URLに何かが含まれている必要があります。

resources :rsvps do
  member { get :thank_you } #GET /rsvps/:id/thank_you(.:format)
end

そのコントローラーアクションを指す一般的なルートが必要な場合は、次のようなものを使用できます。

"/ rsvps / thank_you" => "rsvps#thank_you"に一致します: "rsvp_thank_you"

于 2012-07-15T15:38:29.477 に答える
2

任意のコントローラーにアクションを追加できますが、ルートファイルで指定しない限り、railsはこの関数をアクションとして扱いません。これは、ユーザーが作成したコントローラークラスの別の関数として扱われます。

したがって、thank_you関数をアクションとして追加する場合は、これをルートファイルに追加する必要があります。

他の人が彼らの答えで説明したように、そうすることには複数の方法があります。

  • 追加-より安らかな-アクション

    の使用membercollection内部resources

    一部のモデルオブジェクトでのみ関数を使用するmember場合に使用します。例:写真ID1のプレビュー
    GET/ photos /:id / Preview

    この例ではmember、そのようなルートと機能が必要な場合に使用します。

    GET / rsvps /:id / thank_you

    注:メンバーアクションとして指定する場合は、paramsのidが必要です。

    resources :rsvps do
      member do 
        get :thank_you  #GET /rsvps/:id/thank_you(.:format)
      end
    end
    

    collection次のようにアクションを直接呼び出したい場合に使用します

    GET /rsvps/thank_you(.:format)

    リソースで

    resources :rsvps do
      collection do 
          get :thank_you  #GET /rsvps/thank_you(.:format)
      end
    end
    

    ルートに追加するときに、アクションのタイプ(GET | POST)を指定する必要があります。

    この例では、thank_youがGETアクションとして指定されています。どちらかを選択できます。

を使用して、独自のpreety_urlsまたは非RESTfulルートを作成できますmatch。(これには、リソースブロックでアクションを定義する必要もあります)。

詳細については、 http://guides.rubyonrails.org/routing.html#non-resourceful-routesmatchをご覧ください。

Railsチームによって作成されたこの素晴らしいドキュメントを確認することをお勧めします。(もう一度;))http://guides.rubyonrails.org/routing.html

乾杯。

于 2012-07-15T19:32:29.587 に答える
0

あなたが言ったように、あなたは各rsvpのありがとうページを表示したいので、メンバールートを使用する必要があります。このような

resources :rsvps do  
  member get :thank_you
end

thank_youのすべてまたは一部の特定のコレクションを表示する場合は、thank_youのコレクションを使用する必要があります。

これを含めてレーキルートを再度実行すると、そこに新しいhttpアクションが表示されます。

于 2012-07-13T05:53:52.210 に答える