我正在使用rails 4.0.2和globalize 4.0.0.alpha.3,但我无法通过强参数列表将数据写入翻译数据库。
我有一个商品模型和一个顾虑(OfferTranslationConcern)
class Offer < ActiveRecord::Base
include OfferTranslationConcern
end
关注
module OfferTranslationConcern
extend ActiveSupport::Concern
included do
attr_accessor :attribute_translations
translates :name, :city, :includes, :notes, :description, :slug
end
end
控制器
def update
respond_to do |format|
if @offer.update(offer_params)
format.html { redirect_to @offer, notice: 'Offer was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @offer.errors, status: :unprocessable_entity }
end
end
end
和强参数的定义
params.require(:user).permit('a lot of offer parameters', :attribute_translations => [:id, :name, :city, :includes, :notes, :description, :slug]
)
对于我使用的翻译,例如西班牙语和意大利语(it和es)。当我更新优惠时,我会获得未经许可的参数:it,es
参数如下所示:
"offer"=>{"attribute_translations"=>{"it"=>{"name"=>"dsfdsf", "city"=>"sdf", "includes"=>"sdfsdf", "notes"=>"sdfsd", "description"=>"fsdf"}, "es"=>{"name"=>"", "city"=>"", "includes"=>"", "notes"=>"", "description"=>""}}, "provider_id"=>"1",...a bunch of other stuff
现在我使用强参数的定义
def offer_params
params.require(:offer).permit!
end
这项工作,但我不认为这是最好的方法。所以,我的问题是,是否有办法定义参数列表并使其工作?
答案 0 :(得分:1)
你宣布这个:
:attribute_translations => [:id, :name, :city, :includes, :notes, :description, :slug]
但你收到了这个:
"attribute_translations"=>{"it"=>{"name"=>"dsfdsf", "city"=>"sdf", "includes"=>"sdfsdf", "notes"=>"sdfsd", "description"=>"fsdf"}
如果:id => "it"
,则需要声明如下:
:attribute_translations => [:id => [:name, :city, :includes, :notes, :description, :slug]]
至少这是您的表单认为您想要的格式。因此,您需要将表单的格式与您的参数或表格中的参数匹配。
permit!
方法并不是你所说的最佳选择,它是非常不安全的,因为它会将传递给它的任何内容列入白名单。如果您需要提交未知数量的参数,则必须使用相当复杂的块。如果是这种情况,请阅读:Unpermitted parameters for Dynamic Forms in Rails 4
答案 1 :(得分:1)
通过globalize-accessors宝石避免这种痛苦。 attr-accessor被弃用,gem直接解决这个问题。在我们的翻译栏声明
之后,模型需要一个单行globalize_accessors :locales => [:it, :en, :fr, :es, :de, :gr], :attributes => [:name]
控制器也是一个单行(如果所有字段都被翻译),如果混合匹配则为两个
params.require(:channel).permit(*Channel.globalize_attribute_names)
视图帮助器lang
过于简单,特别是如果您有许多区域设置和许多列。将它放在它的设备上只是一个流......但是有点红宝石并且依赖于这样的事实,即视觉效果得到了显着改善:
<% Channel.globalize_attribute_names.each do |lang| %>
<% if lang[-2, 2] == "it" %>
<div class="row highlight">
<h5><%= lang[0..-4] %></h5>
<% end %>
<div class=" .... columns">
<%= lang[-2, 2] %>
<%= f.text_area lang, rows: "3" %>
</div>
<% if (lang[-2, 2] == "gr") %>
</div>
<% end %>
<% end %>
注意:此处显示的布局需要遵循application.rb中定义的语言环境的顺序(此处:first:it,last:gr),以避免任何问题