当我通过Laravel文档了解Eloquent ORM主题部分时,我得到了一个新术语Mass Assignment.
文档显示如何进行质量分配和fillable或guarded属性设置.但经过这一切,我没有清楚地了解Mass Assignment它是如何工作的.
在我过去的CodeIgniter经历中,我也没有听说过这个术语.
有没有人对此有一个简单的解释?
在这篇文章中,切片函数用于仅获取参数的必要元素.我应该使用什么函数来排除params元素(例如user_id)?
Article.new(params[:article].slice(:title, :body))
Run Code Online (Sandbox Code Playgroud)
谢谢.
更新代码格式以便更好地查看.
伙计们,
我一直在看这个,但我不明白这里有什么可能搞乱的.我正在使用Devise.
class User < ActiveRecord::Base
has_many :addresses
accepts_nested_attributes_for :addresses
# Other stuff here
end
class Address < ActiveRecord::Base
belongs_to :user
validates_presence_of :zip #:street_address1,
Run Code Online (Sandbox Code Playgroud)
结束
--------------------日志输出开始--------------------------- ---
在2011-05-28 11:43:27 -0700开始POST"/ users"for 127.0.0.1由RegistrationsController处理#create as HTML参数:{"utf8"=>"√","authenticity_token"=>"CEmdqlsmdYa6Jq0iIf5KAxxISsUCREIrFNXWkP80nhk = ",""user"=> {"email"=>"a2 @ gmail.com","password"=>"[FILT ERED]","addresses_attributes"=> {"0"=> {"street_address1"=> "234 Pitkin Ct.","zip"=>"12456"}}},"commit"=>"注册"}警告:无法批量分配受保护的属性:addresses_attributes SQL(0.0ms)BEGIN SQL(164.0) ms)SHOW TABLES
用户加载(0.0ms)SELECTusers.idFROMusersWHERE(users.--------------------日志输出结束--------------------------- ---
zip已存在于发布的数据中,并且发布的数据似乎已正确格式化.在网页表单上,我收到"地址zip不能为空"的错误.我已经挖了一下导致"无法大量分配受保护属性"的警告,但没有找到任何可以帮助我的东西.
感谢您的想法和指示.
-S
我有一个Rails 3应用程序,JSON对对象进行编码,以便将它们存储在Redis键/值存储中.
当我检索对象时,我正在尝试解码JSON并从数据中实例化它们,如下所示:
def decode(json)
self.new(ActiveSupport::JSON.decode(json)["#{self.name.downcase}"])
end
Run Code Online (Sandbox Code Playgroud)
问题是,这样做涉及质量分配,这是我不知道attr_writer能力的属性是不允许的(有充分理由我被告知!).
有没有办法可以绕过质量分配保护只是为了这个操作?
我收到此错误:
Model.php第448行中的MassAssignmentException:_token
当我使用create方法时.请查看以下代码:
Contacts.php(型号):
class Contacts extends Model
{
protected $table = ['name', 'mobile', 'email', 'address', 'created_at', 'updated_at'];
}
Run Code Online (Sandbox Code Playgroud)
ContactsController.php(Controller):
public function store(Request $request)
{
$inputs = $request->all();
$contacts = Contacts::Create($inputs);
return redirect()->route('contacts.index');
}
Run Code Online (Sandbox Code Playgroud) 我听过几个人抱怨并在Rails中发布有关群发作业的问题.我有几次同样的错误,我所做的就是attr_accessible.但是什么是大规模任务?有人可以用例子解释一下吗?
我知道我可以一次为多个值分配多个变量:
(foo, bar, baz) = 1, 2, 3
Run Code Online (Sandbox Code Playgroud)
并且foo = 1,bar = 2,依此类推.
但是,我如何才能使变量的名称更具动态性?也就是说,
somefunction(data,tupleofnames):
(return that each name mapped to a single datum)
somefunction((1,2,3),(foo,bar,baz))
Run Code Online (Sandbox Code Playgroud)
并有相同的?
只是想明确什么是质量分配以及如何围绕它进行编码.是质量分配许多领域的使用哈希的分配,即喜欢..
@user = User.new(params[:user])
Run Code Online (Sandbox Code Playgroud)
为了防止这种情况,你可以使用attr_accessible:
attr_accessible :name, :email
Run Code Online (Sandbox Code Playgroud)
因此,像管理员这样的字段无法通过批量分配添加?
但是我们可以通过以下方式在代码中修改它:
@user.admin = true
Run Code Online (Sandbox Code Playgroud)
那么,如果我们没有attr_accessible,那么一切都可以进行质量分配吗?
最后一个棘手的问题......是否真的即使有一个attr_accessible如"attr_accessible:name"也意味着所有其他字段现在都无法进行大规模分配?
我有一个多层嵌套表单
User->Tasks->Prerequisites
并以相同的形式
User->Tasks->Location
位置表单工作正常,现在我正在尝试指定当前任务的先决条件.先决条件是存储在:completed_task字段中的task_id.
当我提交表单时,我在输出中收到以下错误
WARNING: Can't mass-assign protected attributes: prerequisite_attributes
对用户中的每个任务发出一个警告.
我已经完成了与此相关的所有其他问题,确保正确引用字段名称:completed_task,
将attr_accessible添加到我的模型中(它已经存在并且我将其扩展).
我不确定我还应该做什么.
我的模特看起来像
class Task < ActiveRecord::Base
attr_accessible :user_id, :date, :description, :location_id
belongs_to :user
has_one :location
accepts_nested_attributes_for :location
has_many :prerequisites
accepts_nested_attributes_for :prerequisites
end
class Prerequisite < ActiveRecord::Base
attr_accessible :completed_task
belongs_to :task
end
表格使用formtastic,我包括表格via
<%= f.semantic_fields_for :prerequisites do |builder3| %>
<%= render 'prerequisite_fields', :f=>builder3 %>
<% end %>
--- _prerequisite_fields.html.erb -----
< div class="nested-fields" >
<%= f. inputs:completed_step %>
</div>
有什么建议?
通过批量分配来防止安全风险的官方方法是使用attr_accessible.但是,一些程序员认为这不是模型的工作(或者至少不仅仅是模型).在控制器中执行此操作的最简单方法是切换params哈希:
@user = User.update_attributes(params[:user].slice(:name))
Run Code Online (Sandbox Code Playgroud)
但是文档说明:
请注意,使用Hash#except或Hash#slice代替attr_accessible来清理属性将无法提供足够的保护.
这是为什么?为什么白名单切片的params不能提供足够的保护?
更新: Rails 4.0将发布强参数,一个精确的参数切片,所以我猜整个切片事情毕竟不是那么糟糕.
ruby security ruby-on-rails mass-assignment strong-parameters
mass-assignment ×10
laravel ×2
php ×2
ruby ×2
activerecord ×1
eloquent ×1
laravel-5 ×1
nested-forms ×1
python ×1
security ×1