【问题标题】:URL helper method uses what default :id?URL 辅助方法使用什么默认 :id?
【发布时间】:2013-03-19 21:38:15
【问题描述】:

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

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

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

非常感谢!


编辑

以下是相关代码:

link_to 'Find Movies With Same Director', same_dir_path   

在这里,我在一个带有 url /movies/1 的“显示”页面上。 same_dir_path 是 URL /movies/same_dir/:id 的辅助方法,其中 :id 是传递对象的方法,movie#same_dircontroller#action。请注意,我没有将任何对象传递给辅助方法 link_to,但是它从前一个 url(在本例中为“1”)获取 :id。该 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 

【问题讨论】:

  • 只是一个提示,因为您是 Rails 新手:常见模式 object.nil? || object == '' 可以使用 object.blank? 表示,它也适用于数组和哈希(array.nil? || array.empty? 变为 array.blank?)跨度>

标签: ruby-on-rails


【解决方案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>

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

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

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

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

【讨论】:

  • 非常感谢丹尼尔的详细回答!虽然我仍然不确定浏览器如何获取 :id 在我的情况下,因为我的 URL not 相对于第一个路径(它是 /movie/same_dir/:id 而上一个链接是 /电影/:id)。我也提交了我的代码。
  • 是的,也找到了你的观点here。非常感谢!
  • 谢谢,我已将其添加到我的答案中以供将来参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2017-10-25
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多