URL帮助器方法使用什么默认值:id?

时间:2013-03-19 21:38:15

标签: ruby-on-rails

我是Rails的新手,对link_to方法有疑问。第二个参数应该是链接的url,可以使用url helper方法生成。但是,可能需要传递:id作为辅助方法的参数,这可以通过传递一个对象(其id:id作为其属性之一)来完成。

好吧,在一个案例中,我没有将对象传递给方法(在其中一个视图中)。但是,url仍然能够获得正确的:id(可能使用前面定义的实例变量)。

当我甚至没有传入任何对象时,Rails如何为:id选择一个值?

非常感谢!


修改

以下是相关代码:

link_to 'Find Movies With Same Director', same_dir_path   

在这里,我正在使用网址/movies/1的“显示”页面。 same_dir_path是网址/movies/same_dir/:id的帮助方法,其中:id是传递的对象,movie#same_dircontroller#action。注意我没有将任何对象传递给辅助方法link_to但是,它从前一个URL获取:id(在这种情况下为'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 

1 个答案:

答案 0 :(得分:1)

在阅读更新后的问题后,我可以为您提供更好的答案:

Rails控制器可以通过url_options方法使用默认网址选项。 (似乎不是一个记录完备的功能。(herehere))

默认情况下,此方法返回当前请求中的参数,这是id来自的位置。

您也可以覆盖它:

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

原始答案(可能仍然有用)

您目睹的很可能是浏览器功能。例如这段代码:

link_to "Show", ""

生成此HTML代码:

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

如果您在浏览器中点击该链接,它会导航到相对于当前网址的空网址,这实际上等于当前网址。

另一个例子:

link_to "Publish", :publish

生成:

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

现在,如果您当前的网址为http://localhost/articles/1/edit,则该链接会将您带到http://localhost/articles/1/publish。 (请注意,即使您没有在HTML源代码中,最终的网址也包含模型ID)

在这两种情况下,浏览器都会保留您当前的型号ID,因为您使用的是相对网址。

此行为可能会为您提供某些神奇模型ID检测的幻觉,尤其是因为浏览器在悬停在链接上时会预览最终(=绝对)网址。

看一下来源,我敢打赌你生成的链接不包含任何模型ID。