2

Ruby on Rails(3.2.2)、globalize3(0.2.0)、batch_translations(0.1.2)のruby-gemを使用しています。「保護属性の一括割り当てができない:translations_attributes」エラーを解決するにはどうすればよいですか?

class Admin::Article < ActiveRecord::Base 
    translates :title 

    # This is needed to make the batch_translations to work. 
    accepts_nested_attributes_for :translations 

    ... 
end 
:私は私の ROOT_RAILS/app/models/admin/article.rbファイルで

... 
gem 'globalize3' 
gem 'batch_translations' 

:私は私のROOT_RAILS/Gemfileファイルで

ActiveModel::MassAssignmentSecurity::Error in Admin::ArticlesController#update 

Can't mass-assign protected attributes: translations_attributes 

:私はbatch_translationsルビーの宝石を使用したときに発生する次のような問題を解決したいと思います

私のROOT_RAILS/app/views/admin/articles/_form.html.erbファイルに私は持っています:

私は編集フォームにすべての作品を表示すると

class Admin::ArticlesController < ApplicationController 

    def update 
    @admin_article = Article.find(params[:id]) 

    respond_to do |format| 
     if @admin_article.update_attributes(params[:article]) 
     format.html { redirect_to admin_article_path(@admin_erticle), notice: 'Article was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @admin_article.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    ... 
end 

が、私はそのフォームを送信するとき、私は上記のエラーを取得:私のROOT_RAILS/app/controllers/admin/articles_controller.html.erbファイルで

は私が持っています。上記のエラーを解決するにはどうすればよいですか?

class Admin::Article < ActiveRecord::Base 
    translates :title 

    attr_accessible :translations_attributes 
    accepts_nested_attributes_for :translations 

    ... 
end 

...しかし、それは確かである:translations_attributesがアクセスできる:


UPDATE

私はROOT_RAILS/app/models/admin/article.rbファイルに次のコードを使用して、解決策を見つけましたか?

答えて

0

はい。 Railsはおそらく、明示的に許可された属性の一括割り当てのみを許可するように設定されています。

# This is mass assignment 
Model.find(params[id]).update_attributes params[:model] 

ホワイトリストアプローチはセキュリティのために強制されます。 params[:model]には、フォーム内で利用できなかった属性が含まれていてもかまいません。攻撃者はこれを利用してadmin: trueと他の値を送信できます。

attr_accessibleが指定されていない場合、攻撃者には管理者権限が与えられます。ただし、:adminがホワイトリストに登録されていない場合、update_attributesはその特定の属性を更新しませんでした。

宝石はおそらく大量生産のためのものです。自分の属性に書き込むことを許可してください。

4

私は同じ問題を抱えていました。私は私のapplication.rbファイルで

gem 'globalize3', '~> 0.2.0' 
gem 'batch_translations', '~> 0.1.2' 

私のGemfileファイルには、私が持っている:私のモデルでは

config.i18n.available_locales = [:es, :en] 

(category.rb)私はこれは良い解決策だと思います私が持っている:私のヘルパー(application_helper.rb)で

class Category < ActiveRecord::Base 
    attr_accessible :name, :translations_attributes 

    translates :name 

    accepts_nested_attributes_for :translations, :reject_if => proc { |attributes| attributes['name'].blank? } 

    validates :name, :presence => true 
end 

Category::Translation.class_eval do 
    attr_accessible :name 
end 

は私が持っている:

私は私のビューファイル(_form.html.erb)で

en.yml

en: 
    locale_selector: 
    es: 'Spanish' 
    en: 'English' 

es.yml

en: 
    locale_selector: 
    es: 'Español' 
    en: 'Inglés' 

:私は私の翻訳ファイルで

module ApplicationHelper 

    def find_available_locales 
    locales = {} 
    I18n.available_locales.each { |locale| locales[locale] = t("locale_selector.#{locale}") } 
    locales 
    end 

    def available_locales 
    @available_locales ||= find_available_locales 
    end 

end 

<%= form_for @category, html: { class: 'form-horizontal' } do |f| %> 
    <% available_locales.each_pair do |locale, name_locale| -%> 
    <% if locale == I18n.locale -%> 
     <div class="control-group"> 
     <%= f.label :name, class: 'control-label' %> 
     <div class="controls"> 
      <%= f.text_field :name, class: 'text_field' %> <i>(<%= name_locale %>)</i> 
     </div> 
     </div> 
    <% else -%> 
     <%= f.globalize_fields_for locale do |g| -%> 
     <div class="control-group"> 
      <%= g.label :name, class: 'control-label' %> 
      <div class="controls"> 
      <%= g.text_field :name, class: 'text_field' %> <i>(<%= name_locale %>)</i> 
      </div> 
     </div> 
     <% end -%> 
    <% end -%> 
    <% end -%> 

    <div class="form-actions"> 
    <%= f.submit nil, class: 'btn btn-primary' %> 
    <%= link_to t('.cancel', default: t("helpers.links.cancel")), 
       categories_path, class: 'btn' %> 
    </div> 
<% end %> 

ご覧のとおり、レール3.2ではアクセス可能な属性を知る必要がありますが、グローバリゼーションはこれを指定しないという問題があります。私のモデル(Category)でattr_accessibleでこれを定義しますが、これも翻訳のために追加する必要があります。このため、同じファイルにいくつかの行を追加して、このモデルの各翻訳でアクセス可能な名前を設定します(Category :: Translation .class_eval)。

関連する問題