我有多语言应用程序,它使用下拉列表在语言(语言环境)之间切换。当您从下拉列表中选择一个元素时,它会使用参数“set_locale = es”提交一个转到某个控制器的表单。
它总是失败并显示一条消息:“ undefined method `permit' for nil:NilClass
”。
这很明显:
form_tag mymodel_path
制作,其中MyModel是
现有的ActiveRecord模型,具有完整的CRUD脚手架。 resources :mymodel
,这意味着该路线
POST (/:locale)/mymodels(.:format) mymodels#create
确实存在。 #create
方法
params[:mymodel].permit(:title,:and_more)
显然引发了异常。我该如何解决这个问题? 有没有办法将带有参数“set_locale”的POST请求路由到#index而不是#create?
注意:我正在遵循实用程序员编写的第4版“使用Rails进行敏捷Web开发”一书中的“15.国际化”一章。
答案 0 :(得分:0)
好吧,让我们尝试对此进行排序。
首先关于最后一个问题:是的,您可以使用routes.rb文件将任何内容路由到任何地方。只需添加类似
的内容post '/:locale/mymodels' => 'mymodels#index', :as => "set_locale"
然后使用set_locale_path
中的form_tag
。您需要在控制器的索引方法中处理区域设置。
第二 Personaly我不想将路由加倍,只使用GET(/some/path?locale=en
)发送语言环境。这样您就不需要添加任何路由,只需将form方法更改为get mymodels_path
(索引操作路径)。您甚至可以使用mymodels_path(:locale => 'en')
替换表单。
第三次当您尝试处理mass_asignment保护时,您应该直接解决params。所以它会像
def mymodel_params
params.require(:mymodel).permit(:title, :and_more)
end
通过这种方式,您无需关心将哪些参数发送到您的控制器,如果您遗漏了某些内容,它就不会中断。