RoR Active Record未定义的方法

时间:2014-09-21 01:16:45

标签: ruby-on-rails ruby activerecord

这是我得到的错误:
未定义的方法`attr_accessible'对于#

按照教程后,我的代码是:

User.rb:

 class User < ActiveRecord::Base

   attr_accessible :email, :password, :password_confirmation

   attr_accessor :password
   before_save :encrypt_password

   validates_confirmation_of :password
   validates_presence_of :password, :on => :create
   validates_presence_of :email
   validates_uniqueness_of :email

users_conroller.rb:

   class UsersController < ApplicationController
    def new
    @user = User.new
 end

 def create
   @user = User.new(params[:user])
   if @user.save
     redirect_to root_url, :notice => "Signed up!"
   else
     render "new"
   end

 end
 end

请帮忙! :(我读到某个地方将js咖啡文件中的一个从咖啡改为js并放入一个脚本以允许它工作但它对我不起作用

3 个答案:

答案 0 :(得分:3)

TL; DR:

此方法未在rails 4中定义。将其从模型中删除并更新控制器,使其如下所示:

class UsersController < ApplicationController
  def new
    @user = User.new
   end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to root_url, :notice => "Signed up!"
    else
      render "new"
    end
  end

  private

  def user_params
    params.require(:user).allow(:email, :password, :password_confirmation)
  end
end

说明:

attr_accessible是rails 3中用于限制对某些参数的访问的方法。其背后的原因是,大多数控制器“创建”或“更新”操作如下所示:

@model.assign_attributes(params[:model])

由于params已由用户发送,因此它可能包含任何内容,包括我们明确不希望它们能够更改的字段(如admin: true)。

Rails 3解释说,只有标有attr_accessible的属性才能被大量分配,即如果用户试图传递额外的参数:admin,它将被{{1}拒绝}方法(在assign_attributesnew等内部使用。)。

现在,这不是最好的想法 - 在某些情况下,我们希望他们能够根据上下文设置一些参数,例如,如果创建记录的用户实际上是管理员,他可以指定另一个用户管理员因此,此安全逻辑已从模型移至控制器,并称为强属性。您可以在顶部的解决方案中看到它使用(create方法)。这种方式更安全,更难被滥用。

答案 1 :(得分:1)

<强> MVC

要进一步BroiState得到惊人的答案,您需要了解Rails如何作为框架 - MVC

enter image description here

MVC 是Rails的核心方面之一 - 它是您处理数据的方式。显示在屏幕上。许多人的问题是他们没有意识到这个系统的价值,因此没有意识到如何让Rails按照他们的要求工作。

当您从系统调用数据时,您基本上使用框架的Model方面 - 调用数据的能力。问题是,自从Rails 3&amp; Rails 4以不同的方式处理这个问题,当你试图访问一个根本不存在的函数/方法时,你会收到错误。

-

<强>滑轨

从Rails的意义上讲,您必须明白,每次从模型中调用数据时,都会通过编译数据库中的相关属性来实现。

虽然您可以根据需要访问尽可能多的数据,但Rails有一些严格的方法来阻止mass assignment - 某人填充属性而不属于您的应用程序流的能力。

这样做的方法是“白名单”不同的属性。 Rails 3使用attr_accessible执行此操作,而Rails 4采用strong_params模式:

  

使用此插件时,禁止使用Action Controller参数   在活动模型批量分配中,直到它们被列入白名单。   这意味着你必须有意识地选择哪个   属性允许批量更新,从而意外地防止   暴露不应暴露的东西。

这里的最大区别在于,在Rails 4中,您可以从模型中访问所需的所有属性(白名单在提交数据时完成);而在Rails 3中,您只能定义使用attr_accessible指令访问的属性。

简单地说,这就是你要做的事情:

#app/models/user.rb
class User < ActiveRecord::Base
  # NO attr_accessible
end

#app/controllers/users_controller.rb
class UsersController < ApplicationController
   def new
      @user = User.new
   end

   def create
      @user = User.new user_params
      @user.save
   end

   private

   def user_params
      params.require(:user).permit(:x, :y, :z)
   end
end

答案 2 :(得分:1)

attr_accessible在rails 4中被删除。 请使用user_params而不是attr_accessible。 在User.rb中

# no attr_accessible

在users_controller.rb

 def create
  @user = User.new user_params
  @user.save
 end

最后

private
  def user_params
     params.require(:user).permit(:email, :password, :password_confirmation)
  end

希望这会有所帮助!!