这是我得到的错误:
未定义的方法`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并放入一个脚本以允许它工作但它对我不起作用
答案 0 :(得分:3)
此方法未在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_attributes
,new
等内部使用。)。
现在,这不是最好的想法 - 在某些情况下,我们希望他们能够根据上下文设置一些参数,例如,如果创建记录的用户实际上是管理员,他可以指定另一个用户管理员因此,此安全逻辑已从模型移至控制器,并称为强属性。您可以在顶部的解决方案中看到它使用(create
方法)。这种方式更安全,更难被滥用。
答案 1 :(得分:1)
<强> MVC 强>
要进一步BroiState
得到惊人的答案,您需要了解Rails如何作为框架 - MVC:
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
希望这会有所帮助!!