我目前通过迈克尔·哈特尔的工作Rails的教程 ,而与未书中涵盖一些其他的事情尝试。 完成后第5章 ,其中创建静态页面,我决定视图代码更改为HAML,国际化页面,并把静态内容到单独的(非部分)降价文件,使用RDiscount宝石,使它们。 例如:
应用程序/视图/ static_pages / about.html.haml
- provide(:title, t('.about_us'))
:markdown
#{render file: "static_pages/about.#{params[:locale]}.md"}
根据static_pages目录,我有这样about.en.md降价文件,about.it.md,about.ja.md等,所以在插补:locale
参数是什么决定了其语言的Markdown文件被渲染。
我的问题是:
- 该static_pages目录位与降价文件拥挤,那么,有没有任何合理的缺省/最佳实践地点(也许外面的应用程序目录中),以保持这些降价文件,在那里他们可以大概由谁也不需要人编辑了解应用程序的内部运作?
- 有什么更好的方法,在那里实现渲染视图多语种的降价文件? 我的使用
:locale
和双串插看起来不太优雅。 有没有办法来改变这种代码,以便我可以通过Ruby的变量进入降价文件? 我知道我可以,例如,使用#{language}
中的变量降价只需更改about.en.md成HAML部分(_about.en.html.haml)和更改代码看起来是这样的:
应用程序/视图/ static_pages / about.html.haml
- provide(:title, t('.about_us')) :markdown #{render "about.#{params[:locale]}", language: 'Markdown!'}
但是,有没有办法做到这一点不改变文件降价成另一种类型的文件? 如果这样的方式存在,它是推荐/可行吗?
在看看经过这个StackOverflow的答案 ,它似乎是对国际化的Markdown文件的最佳位置将是配置下自己的动作名称目录/区域设置目录,并有重构的一个很好的机会render
在了所有视图代码StaticPagesController
。 因此,使用about.html.haml下面的例子中,调用render
在家里 , 帮助 有关 ,和接触的观点已经改变,以完全相同的代码:
应用程序/视图/ static_pages / about.html.haml
- provide(:title, t('.about_us'))
:markdown
#{render file: localized_page_for(action_name, params[:locale])}
该localized_page_for
方法在定义StaticPagesHelper
:
应用程序/佣工/ static_pages_helper.rb
module StaticPagesHelper
def localized_page_for(action, locale)
"#{Rails.root}/config/locales/#{action}/#{action}.#{locale.to_s}.md"
end
end
所以,现在所有的降价文件已被取出应用程序/视图/ static_pages目录,并从各自的逻辑目录被称为(例如配置/区域设置/约/ about.en.md等)使用ActionController
的action_name
属性,语言环境,使更少的混乱。
对于上述问题2,串插似乎足够常见的这类问题,所以我会认为这是“优雅”足够为好。
对于上述问题3,经过详尽的搜索,我还没有找到一种方法的人变量已经通过以一个纯粹的降价文件,并将该文件似乎并没有说关于支持他们什么,所以我打算结束这是不可能的。 如果传递的Ruby变量降价是绝对必要的,该文件将需要通过另一种解释器运行,有点像在描述这个StackOverflow的答案 。
更新:
运行安全扫描后司闸员对应用程序,它想出了一个潜在的动态渲染路径安全警告(虽然是一个很脆弱的)由于动态传递params[:locale]
在render
调用,而不是通过一个静态字符串。 所以,我搬到了调用localized_page
方法出来的意见,提出的方法本身出的StaticPagesHelper
(使文件现在是空的),并在该StaticPagesController
,然后实例化一个@page
在每个方法传递给实例变量风景。 总之,现在该代码看起来是这样的,它并没有得到安全警告:
应用程序/控制器/ static_pages_controller.rb
class StaticPagesController < ApplicationController
before_filter :localized_page, only: [:help, :about, :contact]
def home
if signed_in?
@micropost = current_user.microposts.build
@feed_items = current_user.feed.paginate(page: params[:page])
else
localized_page
end
end
def help
end
def about
end
def contact
end
private
def localized_page
@page = "#{Rails.root}/config/locales/"\
"#{action_name}/#{action_name}.#{params[:locale].to_s}.md"
end
end
应用程序/视图/ static_pages / about.html.haml
- provide(:title, t('.about_us'))
:markdown
#{render file: @page}