全球化gem和Rails 4强参数

时间:2014-01-05 10:09:09

标签: ruby ruby-on-rails-4 rubygems rails-i18n globalize

我正在使用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 

这项工作,但我不认为这是最好的方法。所以,我的问题是,是否有办法定义参数列表并使其工作?

2 个答案:

答案 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),以避免任何问题