我是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_dir
是controller#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
答案 0 :(得分:1)
在阅读更新后的问题后,我可以为您提供更好的答案:
Rails控制器可以通过url_options
方法使用默认网址选项。 (似乎不是一个记录完备的功能。(here和here))
默认情况下,此方法返回当前请求中的参数,这是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。