【问题标题】:Mongoid w/ Rails, attr_accessible --> "No method found"带 Rails 的 Mongoid,attr_accessible -->“未找到方法”
【发布时间】:2013-06-16 17:36:24
【问题描述】:
  • 生成的没有 Active Record 的 Rails 应用程序
  • 为 Mongoid(Mongodb 和 Mongoid)添加了适当的宝石
  • 在 config/ 中生成了 mongoid.yml 文件,支持 rails
  • 使用典型的 CRUD 路由创建朋友模型和用户控制器

一切正常,除了当我尝试做大量作业时,我得到: "undefined method `attr_accesible' for Friend:Class"

模特、朋友.rb:

class Friend include Mongoid::Document field :first_name, :type => String field :last_name, :type => String field :adjective, :type => String attr_accessible :first_name, :last_name, :adjective end
development:
  sessions:
    default:
      database: first_development
        hosts:
          - localhost:27017
        options:
        options:
test:
  sessions:
    default:
      database: first_test
      hosts:
        - localhost:27017
      options:
        consistency: :strong
        max_retries: 1
        retry_interval: 0

想法?

【问题讨论】:

  • 链接“paul-wong-jr.blogspot.com/2012/03/…”表示要在 attr_accessible 行下方添加 attr_accessor :accessible。原因是“#:accessible 是一个变量,用于存储游戏特定的动态字段,以便可以通过 attr_accessible 批量赋值来设置它们。这允许动态设置 attr_accessible。”
  • 我也遇到了同样的问题。 @user1455116 的建议无效。你用的是哪个版本的 rails 和 mongoid?

标签: ruby-on-rails mongodb mongoid


【解决方案1】:

好的,我找到了问题所在。

首先,我假设您使用的是 Rails 4。您收到此错误的原因是 attr_protectedattr_accessible 已从 Rails 4 中删除并放置在它们自己的 gem 中。 Rails 现在鼓励一种新的保护模型。您可以在README 中阅读有关此内容的信息。如果您想继续使用旧行为,则必须包含protected_attributes gem。希望对您有所帮助。

编辑:我在下面添加了说明,因为这可能是用户升级到 Rails 4 的常见问题。

如果您想继续使用attr_accessible,即Rails 3 方式,只需将gem protected_attributes 添加到您的Gemfile。

如果你想以 Rails 4 的方式开始做事,你不能再使用attr_accessible。相反,您必须将属性权限逻辑移动到控制器中。这是一个例子:

class UsersController < ApplicationController
  def create
    # Using params[:user] without calling user_params will throw an error because 
    # the parameters were not filtered. This is just some Rails magic.
    @user = User.new user_params
    if @user.save
      # Do whatever
    else
      render action: :new
    end
  end

  private
  def user_params
    # params.require(:user) throws an error if params[:user] is nil

    if current_user.nil? # Guest
      # Remove all keys from params[:user] except :name, :email, :password, and :password_confirmation
      params.require(:user).permit :name, :email, :password, :password_confirmation
    elsif current_user.has_role :admin
      params.require(:user).permit! # Allow all user parameters
    elsif current_user.has_role :user
      params.require(:user).permit :name, :email, :password, :password_confirmation
    end
  end

【讨论】:

  • 你的假设是正确的 - 我使用的是 rails 4。我会在我的开发机器上检查这个
  • 嘿,所以根据您链接的自述文件,保护模型似乎在导轨内部。 github.com/rails/strong_parameters#compatibility 它说它现在与 rails 捆绑在一起,所以我不应该使用任何 gem 来完成这项工作。
  • 自述文件用于strong_parameters gem,这是当前的 Rails 4 标准。第二个链接指向protected_attributes gem。 protected_attributesgem 包含 attr_accessible 方法,但 protected_attributes 已从 Rails 4 中删除。如果您想继续在 rails 4 中使用 attr_accessible 方法,您必须将以下内容添加到 Gemfile:gem 'protected_attributes'
  • 我做到了 - 但你的回答不是我问题的解决方案,因此只有一半的赏金 - 我非常感谢你的回答 :) 解决方案是 - 不要使用它! attr_accessible 在使用 devise / mongoid 时似乎只是一个可选的东西,所以我把它排除在外,一切正常。我遇到的问题源于其他原因
【解决方案2】:

对于任何使用 Rails 5 并发现 protected_attributes gem 不兼容的读者:

您不再需要 attr_accessible,因为无法再进行批量分配 https://www.rubyplus.com/articles/3281-Mass-Assignment-in-Rails-5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 2013-06-05
    • 1970-01-01
    相关资源
    最近更新 更多