2

スキャフォールドを生成すると、次のようなコントローラーが作成されます (一部のコードを削除しましたが、まだ機能します)。

  def create
    @post = Post.new(params[:post])

    if @post.save
      redirect_to @post
    end
  end

これにより、すべて正常に動作する /posts/ idにリダイレクトされます。

しかし、これがどのように機能するのかわかりません。@postはモデル クラスのインスタンスですが、リダイレクト先のコントローラーとアクションをどのように知るのでしょうか? この関係が (Postモデルとの間でPostsController) 明示的に定義されている場所はどこにもありません。

url_forこれをスキャフォールディングせずにゼロから複製しようとしましたが、定義したモデルに関連付けられていないというエラーが表示されます。resourcesin でルートを定義する場合でもroutes.rb

4

2 に答える 2

2

呼び出すと、メソッドを呼び出しredirect_toてパスを計算します_compute_redirect_to_location

そして、そのメソッドelseのステートメントに到達します

そして、到達url_forするメソッドの呼び出しも同様です。else

And はpolymorphic_path(and polymorphic_url) hereを呼び出します。

ここでconvert_to_model(record) メソッドが呼び出されました。

どこrecord == @post

inflectionあなたが到達elseすることを計算すると、それは:singular

たどり着いてからbuild_named_rout_call

と呼び出しますActiveModel::Naming.singular_route_key(@post)。あなたは得るでしょう['post']

あなたroute << routing_type(options)のルートが['post', :url]

と同じsend(" @postpost_url args", args)に入れますpost_path(@post)

どこか間違っていたらすみません。についてご理解いただければ幸いですredirect_to @post

于 2013-05-11T05:38:34.760 に答える
0

それが機能する理由は、コントローラーの Post create メソッドがまだそこにあるためです。これは私には正常に見えます。また、routes.rb ファイルには、おそらく resources: posts/1/ などのすべてのコントローラー アクションをカバーする posts のようなものがあるためです。 . もう 1 つのことは、routes.eb ファイルを編集/変更するときに、サーバーを再起動することを確認することです。これが理解できるほど明確であることを願っています。

于 2013-05-11T04:54:03.377 に答える