当params具有比表列更多的参数时会发生什么

时间:2014-02-26 11:14:55

标签: ruby-on-rails ruby

在rails中,此类型代码自动生成

@post = Post.new(params[:article_post])
@post.save

当参数多于数据库表列时会发生什么?在数据库表中我们有列post_name post_id,在表单中我还有一个复选框以及另一个输入字段,它不需要保存在数据库表中但需要验证。在这种情况下,上述代码如何工作。我想知道基础知识。

由于

3 个答案:

答案 0 :(得分:1)

@post = Post.new(params[:article_post])
@post.save

Rails只接受来自请求的那些与表属性匹配的参数。

对于您的复选框验证,您可以手动检查,如:

if params[:check_box_attributes_name]
  @post = Post.new(params[:article_post])
  @post.save
end

答案 1 :(得分:0)

@post = Post.new(params[:article_post])
@post.save

此代码保存与模型属性匹配的列,并为它们分配给定值并保存在数据库中。从表单发布但在数据库中没有匹配属性的列不会影响代码。

答案 2 :(得分:0)

我假设你使用Rails 3,因为Rails 4有不同的行为。当您发送newcreateattributes=或其他一些消息并传递哈希(并且params[:article_post] 哈希)时,rails会内部迭代通过散列并在模型对象上调用#{param_name}=方法。也就是说,

Post.new(:name => 'hello', :something_not_in_db => "Amazing!")

相当于

post = Post.new
post.name= 'hello'
post.something_not_in_db= "Amazing!"

实际上,rails首先会检查您传入散列的所有选项是否都允许使用attr_accessible进行设置。但是,如果您的模型表是否有列,则无关紧要,只关注响应attribute_name=消息