0

我有多语言应用程序,它使用下拉菜单在语言(区域设置)之间切换。当您从下拉列表中选择一个元素时,它会提交一个表单,该表单将使用参数“set_locale=es”发送到某个控制器。它总是失败并显示一条消息:“ undefined method `permit' for nil:NilClass”。

这很明显:

  • 表单由 制成form_tag mymodel_path,其中 MyModel 是现有的 ActiveRecord 模型,具有完整的 CRUD 脚手架。
  • “routes.rb”文件说resources :mymodel,这意味着该路线 POST (/:locale)/mymodels(.:format) mymodels#create确实存在。
  • 该表单适用于 POST 模型,因此当我使用区域设置选择器时,控制器会收到一个 POST 并认为我正在创建一个新的 MyModel,因此它会路由到#create调用 params[:mymodel].permit(:title,:and_more)明显引发异常的行的方法。

我该如何解决这个问题?有没有办法将带有参数“set_locale”的 POST 请求路由到 #index 而不是 #create ?

注意:我正在关注 Pragmatic Programmers 的“Agile web development with Rails”第 4 版一书的“15. 国际化”一章。

4

1 回答 1

0

好吧,让我们试着整理一下。

首先关于最后一个问题:是的,您可以使用您的 routes.rb 文件将任何东西路由到任何地方。只需放置类似的东西

post '/:locale/mymodels' => 'mymodels#index', :as => "set_locale"

然后set_locale_path在你的form_tag. 您需要在控制器的 index 方法中处理语言环境设置。

第二个人我不喜欢加倍路线,只使用 GET ( /some/path?locale=en) 发送语言环境。这样您就不需要添加任何路由,您只需更改要获取的表单方法和路径mymodels_path(索引操作路由)。您甚至可以使用链接替换表单,然后使用mymodels_path(:locale => 'en').

第三,当您尝试处理 mass_asignment 保护时,您应该直接处理参数。所以它会像

def mymodel_params
  params.require(:mymodel).permit(:title, :and_more)
end

这样你就不需要关心什么参数被发送到你的控制器,如果你错过了什么也不会中断。

于 2013-08-30T07:27:40.750 回答