1

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

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

当我什至没有传入任何对象时,Rails 是如何为 :id 选择值的?

非常感谢!


编辑

以下是相关代码:

link_to 'Find Movies With Same Director', same_dir_path   

在这里,我在一个带有 url 的“显示”页面上/movies/1same_dir_path是 URL 的辅助方法,其中/movies/same_dir/:id:id是传递对象的辅助方法,并且movie#same_dircontroller#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_options方法具有默认的 url 选项。(似乎不是一个非常有记录的功能。(herehere))

默认情况下,此方法从当前请求返回参数,这就是 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. (请注意,最终 url 包含模型 ID,即使 HTML 源代码中没有它)

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

这种行为可能会给您一种神奇的模型 ID 检测错觉,尤其是因为浏览器在将鼠标悬停在链接上时会预览最终(=绝对)url。

看看源代码,我敢打赌您生成的链接不包含任何模型 ID。

于 2013-03-19T22:17:34.513 回答