未定义的方法`permit'用于nil:NilClass有一个locale选择器,如何防止它?

时间:2013-08-29 18:46:19

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

我有多语言应用程序,它使用下拉列表在语言(语言环境)之间切换。当您从下拉列表中选择一个元素时,它会使用参数“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?

注意:我正在遵循实用程序员编写的第4版“使用Rails进行敏捷Web开发”一书中的“15.国际化”一章。

1 个答案:

答案 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

通过这种方式,您无需关心将哪些参数发送到您的控制器,如果您遗漏了某些内容,它就不会中断。