2

Rails 4.0.2 を使用し、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

globalize-accessors gemを使用して、この問題を回避してください。attr-accessor は非推奨であり、gem はこれに直接対処します。モデルには、翻訳列の宣言の後にワンライナーが必要です

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

コントローラーもワンライナー (すべてのフィールドが翻訳されている場合)、ミックス アンド マッチの場合は 2 つです。

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

lang特に多くのロケールと多くの列がある場合、View ヘルパーは単純化されすぎています。デバイスにそのままにしておくのは単なるストリームです...しかし、少しルビーで、ロケールが一貫して提供されるという事実に依存すると、ビジュアルが大幅に改善されます。

 <% 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 で定義されているロケールの順序 (ここでは最初: it、最後: gr) に従う必要があります...

于 2015-10-10T16:32:15.817 に答える