ruby-on-rails - 如何解决 "Can' t mass-assign protected attributes : translations_attributes"error?

标签 ruby-on-rails ruby ruby-on-rails-3 translation globalization

我正在使用 Ruby on Rails (3.2.2),globalize3 (0.2.0) 和 batch_translations (0.1.2) ruby 。我想解决使用 batch_translations ruby​​-gem 时产生的以下问题:

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

Can't mass-assign protected attributes: translations_attributes

在我的 ROOT_RAILS/Gemfile 文件中我有:

...
gem 'globalize3'
gem 'batch_translations'

在我的 ROOT_RAILS/app/models/admin/article.rb 文件中我有:

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/views/admin/articles/_form.html.erb 文件中我有:

<%= form_for(@admin_article, :url => admin_article_path) do |f| %>
    <%= f.label :title %><br />
    English translation:
    <%= f.text_field :title %>

    Italiano translation:
    <%
      # Note: I am using the '<%= f...' instad of '<% f...' otherwise
      # batch_translations doesn't output the input field in the
      # front-end content.
    %>
    <%= f.globalize_fields_for :it do |g| %>
      <%= g.text_field :title %>
    <% end %>
<% end %>

在我的 ROOT_RAILS/app/controllers/admin/articles_controller.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/models/admin/article.rb 文件中的以下代码找到了解决方案:

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

  attr_accessible :translations_attributes
  accepts_nested_attributes_for :translations

  ...
end

...但是使 :translations_attributes 可访问是确定的吗?

最佳答案

我遇到了同样的问题。我认为这是一个很好的解决方案:

在我的 Gemfile 文件中我有:

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

在我的 application.rb 文件中我有:

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

在我的模型 (category.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

在我的助手 (application_helper.rb) 中,我有:

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

在我的翻译文件中我有:

zh.yml

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

es.yml

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

在我的 View 文件 (_form.html.erb) 中,我有:

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

如您所见,问题是 rails 3.2 需要知道哪些属性可以访问,但是 globalize 没有指定这个。所以我在我的模型(类别)中用 attr_accessible 定义了它,但我也需要为翻译添加它,因此我在同一个文件中添加了几行来为这个模型中的每个翻译设置可访问的名称(Category::Translation .class_eval).

关于ruby-on-rails - 如何解决 "Can' t mass-assign protected attributes : translations_attributes"error?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10139245/

相关文章:

sql - Rails has_many 清除方法

ruby-on-rails - 如何在 Rails 应用程序中使用单独的类?

sql - 如何使用 Arel 正确地向带有 'or' 和 'and' 子句的 SQL 查询添加括号?

ruby-on-rails - Rake 总是出现段错误和核心转储,即使在成功时也是如此

ruby-on-rails - 从 www 重定向到非 www 的 Nginx HTTPS 问题

ruby-on-rails - Rails系统规范是否仍然需要DatabaseCleaner?

ruby-on-rails - 查找具有所有关联记录的记录

ruby-on-rails - 如果日期等于今天或将来的日期,则从 postgres 呈现事件

ruby - 如何在 Ruby 中的类方法中调用方法

ruby-on-rails - Controller 中的实例变量如何可用于 Rails 中的 View