1

Railsは初めてで、link_toメソッドについて疑問がありました。2番目の引数は、URLヘルパーメソッドを使用して生成できるリンクのURLである必要があります。ただし、ヘルパーメソッドの引数として:idを渡す必要がある場合があります。これは、オブジェクト(属性の1つとして:idを持つ)を渡すことで実行できます。

あるケースでは、オブジェクトをメソッドに渡しませんでした(ビューの1つで)。ただし、URLは正しい:idを取得できました(おそらく以前に定義されたインスタンス変数を使用)。

オブジェクトを渡さなかったときに、Railsはどのようにして:idの値を選択しましたか?

どうもありがとう!


編集

関連するコードは次のとおりです。

link_to 'Find Movies With Same Director', same_dir_path   

ここでは、URLの「ショー」ページを表示してい/movies/1ます。はsame_dir_pathURLのヘルパーメソッドです。/movies/same_dir/:idここ:idで、は渡されたオブジェクトのヘルパーメソッドでありmovie#same_dir、はcontroller#actionです。ヘルパーメソッドにオブジェクトを渡さなかったことに注意してくださいlink_to。それでも、:id前のURL(この場合は「1」)からオブジェクトを取得します。URLは前のURLとは相対的ではありません(パスが異なります)。


これはコントローラーメソッド(same_dir)です。

def same_dir    
  @movies = Movie.find(params[:id])

  if (@movies.director.nil? || @movies.director == '')

    flash.keep  
    redirect_to movies_path         
    flash[:warning]="'#{@movies.title}' has no director info"                 
    return

  end   

  @otherMovies = Movie.find_all_by_director(@movies.director)   

end

これはroutes.rbコードです:

match 'movies/same_dir/:id'=> 'movies#same_dir', :as => :same_dir
resources :movies 
4

1 に答える 1

1

あなたの更新された質問を読んだ後、私はあなたにもっと良い答えを提供することができます:

Railsコントローラーは、メソッドを介してデフォルトのurlオプションを持つことができますurl_options。(あまり文書化されていない機能のようです。(ここここ))

デフォルトでは、このメソッドは現在のリクエストからパラメータを返し、そこからIDが取得されます。

あなたもそれを上書きすることができます:

def url_options
  { my_parameter: my_value }.merge(super)
end 

元の答え(まだ役立つかもしれません)

あなたが目撃しているのは、おそらくブラウザの機能です。たとえば、次のコード:

link_to "Show", ""

このHTMLコードを生成します:

<a href="">Show</a>

ブラウザでそのリンクをクリックすると、現在のURLを基準にした空のURLに移動します。これは、実際には現在のURLと同じです。

もう一つの例:

link_to "Publish", :publish

生成:

<a href="publish">Publish</a>

現在のURLがhttp://localhost/articles/1/editそのリンクである場合は、に移動しますhttp://localhost/articles/1/publish。(HTMLソースにモデルIDがない場合でも、最終URLにはモデルIDが含まれていることに注意してください)

どちらの場合も、相対URLを使用しているため、現在のモデルIDはブラウザによって保持されます。

この動作により、特にブラウザがリンクにカーソルを合わせたときに最終的な(=絶対)URLをプレビューするため、魔法のモデルIDが検出されたように見える場合があります

ソースを見てください。生成されたリンクにはモデルIDが含まれていないに違いありません。

于 2013-03-19T22:17:34.513 に答える