2

我正在使用 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)。当我更新报价时,我得到Unpermitted parameters: 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 

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

4

2 回答 2

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!方法不是最佳选择,它非常不安全,因为它会将传递给它的任何内容列入白名单。如果您需要提交未知数量的参数,则必须使用相当复杂的块。如果是这种情况,请阅读:Rails 4 中动态表单的未经允许的参数

于 2014-01-06T06:13:00.957 回答
1

通过globalize-accessors gem避免这种痛苦。attr-accessor 被弃用,gem 直接解决了这个问题。模型在我们的翻译列声明之后需要单行

globalize_accessors :locales => [:it, :en, :fr, :es, :de, :gr], :attributes => [:name]

控制器也是单行的(如果所有字段都翻译了),两个如果混搭

params.require(:channel).permit(*Channel.globalize_attribute_names)

View 帮助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)以避免任何问题

于 2015-10-10T16:32:15.817 回答