【问题标题】:Globalize gem and Rails 4 strong parameters全球化 gem 和 Rails 4 强参数
【发布时间】:2025-12-05 00:30:02
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    你是这样声明的:

    :attribute_translations => [:id, :name, :city, :includes, :notes, :description, :slug]
    

    但是你收到了这个:

    "attribute_translations"=>{"it"=>{"name"=>"dsfdsf", "city"=>"sdf", "includes"=>"sdfsdf", "notes"=>"sdfsd", "description"=>"fsdf"}
    

    如果 :id =&gt; "it" 则需要这样声明:

    :attribute_translations => [:id => [:name, :city, :includes, :notes, :description, :slug]]
    

    至少这是您的表单认为您想要的格式。因此,您需要将表单的格式与您的参数或您的参数与您的表单相匹配。

    permit! 方法不是您所说的最佳选择,它非常不安全,因为它会将传递给它的任何内容列入白名单。如果您需要提交未知数量的参数,则必须使用相当复杂的块。如果是这种情况,请阅读:Unpermitted parameters for Dynamic Forms in Rails 4

    【讨论】:

      【解决方案2】:

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

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

      Controller也是单行的(如果所有字段都被翻译的话),两个如果你混合搭配

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

      【讨论】:

        最近更新 更多