如何在Rails 4中定义link_to的默认格式?

时间:2014-08-19 12:41:12

标签: ruby-on-rails ruby-on-rails-4

我已经看到了一些类似的问题:

How to set the default format for a route in Rails?

Rails 3 respond_to: default format?

Rails 3.1 force .html instead of no extension

但是对于我来说,任何解决方案都无法在rails 4中运行:

routers.rb

中的

 :defaults => { :format => 'html' }
app/controllers/some_controller.rb

中的

before_filter :set_format

def set_format
  request.format = 'html'
end
config/application.rb

中的

config.default_url_options = { :format => "html" }

任何一个。我尝试了所有这些并且各自分开。

这是我的代码:

link_to("Read more", article_path(article, :format => "html"))
# => <a href="/1.html">Read more</a> 

如果我删除:format => "html"将会是什么:

link_to("Read more", article_path(article))
# => <a href="/1">Read more</a> 

我想要的是什么:

link_to("Read more", article_path(article))
# => <a href="/1.html">Read more</a> 

请分享您的建议。

1 个答案:

答案 0 :(得分:1)

如果您使用将这些选项添加到路线中,我认为您最终会在路径中找到.html。您甚至不需要修改对article_path的调用。

format: true, defaults: { format: 'html' }
我遇到了类似的事情。浏览Rails routing docs帮助我找到答案。

我有一项操作,我想默认为CSV格式,但我还想生成其中包含.csv的网址。通过这种方式,客户端可以通过查看URL来判断它是否为CSV。如果没有.csv,那么链接的内容就不太清楚了。

我的路线是这样的:

get 'customers/with_favorite_color/:color' => 'customers#with_favorite_color', as: :customers_with_favorite_color, format: 'csv'

我正在生成这样的链接:

customers_with_favorite_color_url(color: 'blue', format: :csv)
# => `http://localhost:3000/customers/with_favorite_color/blue

除此之外,我想要http://localhost:3000/customers/with_favorite_color/blue.csv

如果在路由中也指定了该格式,则似乎不会将格式添加到URL中。

为了实现这一点,我将路线改为

get 'customers/with_favorite_color/:color' => 'customers#with_favorite_color', as: :customers_with_favorite_color, format: true, defaults: { format: 'csv' }

请注意,添加/更改的选项为:format: true, defaults: { format: 'csv' }

现在,当我生成网址时,我会像我想要的那样附加.csv

customers_with_favorite_color_url(color: 'blue')
# => `http://localhost:3000/customers/with_favorite_color/blue.csv

<强>更新

要将此应用于多个路线,您可以遵循How to set default format for routing in Rails?的建议并使用具有这些默认值的范围。

scope format: true, defaults: { format: 'html' } do
  # Define your resources here like normal
end