2014-01-05 7 views
2

Я использую rails 4.0.2 и globalize 4.0.0.alpha.3, но я не могу заставить записывать данные в базы данных трансляции со списком сильных параметров.Локализуйте gem и Rails 4 сильные параметры

У меня есть предложение модели и беспокойство (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] 
    ) 

Для переводов я использую, например, испанский и итальянский языки (это и есть). Когда я обновляю предложение я получаю Самовольная параметры: это, эс

Параметры выглядит следующим образом:

"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 

Эта работа, но я не думаю, что это лучший способ. Итак, мой вопрос в том, есть ли способ определить список параметров и сделать эту работу?

ответ

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

+0

Thx для ответа. –

1

Избегайте этой боли через жемчужину globalize-accessors. attr-accessor устарел, этот камень непосредственно обращается к нему. Модель требует Однострочник после того, как наши переводы колонн декларации

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 %> 

Примечание: расположение показано здесь необходимо следить за тем, локалей (здесь: во-первых: это, last: gr), как определено в application.rb ... во избежание любых проблем

Смежные вопросы