标签: mass-assignment

在Rails中使用accepts_nested_attributes_for +质量分配保护

假设你有这个结构:

class House < ActiveRecord::Base
  has_many :rooms
  accepts_nested_attributes_for :rooms
  attr_accessible :rooms_attributes
end

class Room < ActiveRecord::Base 
  has_one :tv
  accepts_nested_attributes_for :tv
  attr_accessible :tv_attributes
end

class Tv 
  belongs_to :user
  attr_accessible :manufacturer
  validates_presence_of :user
end
Run Code Online (Sandbox Code Playgroud)

请注意,Tv的用户无法故意访问.所以你有一个三层嵌套的表格,允许你在一个页面上输入房子,房间和电视.

这是控制器的创建方法:

def create
  @house = House.new(params[:house])

  if @house.save
    # ... standard stuff
  else
    # ... standard stuff
  end
end
Run Code Online (Sandbox Code Playgroud)

问题:你将如何填充user_id每个电视(它应该来自current_user.id)?什么是好的做法?

这是我在这看到的catch22.

  1. user_ids直接填充params哈希(它们非常嵌套)
    • 保存将失败,因为user_ids不可批量分配
  2. 在#save完成后为每个电视填充用户
    • 保存将失败,因为user_id必须存在
    • 即使我们绕过上述情况,电视也会暂时没有ids - 很糟糕

有任何体面的方式吗?

ruby ruby-on-rails nested-forms mass-assignment

6
推荐指数
1
解决办法
4515
查看次数

无法批量分配受保护的属性:配置文件,

我阅读了很多相关的帖子,但找不到为什么它不适合我.我还有一个"无法大量分配受保护的属性:个人资料"......我做错了什么?

我有一个User模型和一个具有一对一关系的相关Profile模型.这里的用户模型(简化)

class User < ActiveRecord::Base
  attr_accessible :email, :password, :password_confirmation, :profile_attributes, :profile_id
  has_secure_password

  has_one :profile

  accepts_nested_attributes_for :profile
end
Run Code Online (Sandbox Code Playgroud)

Profile模型

class Profile < ActiveRecord::Base
attr_accessible :bio, :dob, :firstname, :gender, :lastname, :user_id

belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

我的用户控制器

def new
@user = User.new 
  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @user }
  end
end

def create
@user = User.new(params[:user])
@user.build_profile

respond_to do |format|
  if @user.save

    format.html { redirect_to @user, flash: {success: 'User was successfully created. Welcome !'} }
    format.json …
Run Code Online (Sandbox Code Playgroud)

nested-forms mass-assignment nested-attributes ruby-on-rails-3.2

6
推荐指数
1
解决办法
603
查看次数

如何以编程方式为magento中的产品分配类别

我是magento的新手.基本上,我想将多个产品分配给多个类别.我已经关注这篇文章了,我已经完成了以下代码,它运行正常:

   $collection = Mage::getModel('catalog/product')->getCollection();//my coustom collection
        $categorys_ids = array(1,2,3,4,5);//Array of ids etc 
        if ($categorys_ids != NULL && $collection->getData()!= NULL)
            {
                foreach ($collection as $product) 
                {
                        $categories_pd = $product->getCategoryIds();                              
                        $product->setCategoryIds(array_merge($product->getCategoryIds(),array($categorys_ids)));
                        $product->save();
                }
            }
Run Code Online (Sandbox Code Playgroud)

现在,主要问题是,当我为产品分配设置类别ID时,需要花费大量时间.我有200个产品,这需要两分钟左右,这是很多时间.

我想知道是否有一种方法可以为产品阵列分配类别,而不是将产品分配到类别或可以优化的东西,花费更少的时间.

product magento categories mass-assignment

6
推荐指数
1
解决办法
8795
查看次数

Rails_admin质量分配错误与Rails 4

我刚刚更新到Rails 4,当我尝试编辑任何内容然后点击保存时,rails_admin正在给我这个:

Can't mass-assign protected attributes for Opportunity: created_by_id, contact_information, sent_expiring_email
Run Code Online (Sandbox Code Playgroud)

从我在这里看到的看起来,rails_admin似乎不允许非attr可访问的东西可编辑,但似乎是这种情况.

我知道转向强参数会解决这个问题.是这样的吗?有没有不同的方法来解决它?或者,如果没有,有人可以提供如何移动到强参数的简单解释.我已经尝试了通常的谷歌搜索并阅读它,但我真的不明白发生了什么以及我需要在我的代码中做些什么来改变.

mass-assignment rails-admin strong-parameters ruby-on-rails-4

6
推荐指数
1
解决办法
251
查看次数

Laravel 5.2多模型save()

我需要存储恰好三个页面,在通过形式一次。我希望以与模型save()方法类似的方式进行保存,因为这将自动更新记录时间戳。

如何一次对多个记录执行此操作?

我的页面型号

namespace App;
use Illuminate\Database\Eloquent\Model;

class Page extends Model{
     protected $table = 'simple_pages';
}
Run Code Online (Sandbox Code Playgroud)

我的代码

public function createPages(Request $request){ // I use Page at the top
     $data = [
          [
          'title'=> $request->first,
          'content'=> $request->firstCont
          ],[
          'title'=> $request->second,
          'content'=> $request->secondCont
          ][
          'title'=> $request->third,
          'content'=> $request->thirdCont
          ]
     ];
     Page::unguard();
     $pages = new Page($data);
     $pages->save(); // Something like this would be amazing
     Page::reguard();
}
Run Code Online (Sandbox Code Playgroud)

注意:我强烈反对创建多个Page模型实例,然后将它们循环以保存每个实例。另外,我也不想使用数据库插入,因为它不会自动更新记录时间戳。

mass-assignment eloquent laravel-5.2

6
推荐指数
2
解决办法
1万
查看次数

如何解决批量分配:Java中不安全的活页夹配置(API滥用,结构化)

我有一个Controller类,其中包含以下两种查找医生的方法(上下文已更改)。获取 质量分配:两种方法上的不安全的活页夹配置(API滥用,结构化)错误。

@Controller
@RequestMapping(value = "/findDocSearch")
public class Controller {

    @Autowired
    private IFindDocService findDocService;

    @RequestMapping(value = "/byName", method = RequestMethod.GET)
    @ResponseBody
    public List<FindDocDTO> findDocByName(FindDocBean bean) {
        return findDocService.retrieveDocByName(bean.getName());
    }

    @RequestMapping(value = "/byLoc", method = RequestMethod.GET)
    @ResponseBody
    public List<FindDocDTO> findDocByLocation(FindDocBean bean) {
        return findDocService.retrieveDocByZipCode(bean.getZipcode(),
        bean.getDistance());
    }
}
Run Code Online (Sandbox Code Playgroud)

我的豆是:

public class FindDocBean implements Serializable {
    private static final long serialVersionUID = -1212xxxL;

    private String name;
    private String zipcode;
    private int distance;

    @Override
    public String toString() {
        return String.format("FindDocBean[name: %s, …
Run Code Online (Sandbox Code Playgroud)

java spring spring-mvc mass-assignment fortify

6
推荐指数
1
解决办法
8399
查看次数

rails:与belongs_to关系的大规模分配安全性问题

我一直在阅读关于rails安全问题的内容,而让我最关心的是大规模分配.我的应用程序正在使用attr_accessible,但是我不确定我是否完全知道处理暴露关系的最佳方法是什么.假设我们有一个基本的内容创建/所有权网站.用户可以创建博客帖子,并且具有与该博客帖子相关联的一个类别.

所以我有三个型号:

  • 用户
  • post:属于用户和类别
  • 类别:属于用户

我允许在category_id上进行质量分配,因此用户可以将其取消,将其更改为其中一个类别,或通过批量分配,我认为他们可以将其更改为其他人的类别.这就是我不确定最好的方法是什么.

我调查的资源(特别是railscast#178和从该railscast提供的资源)都提到该关联不应该是可批量分配的,这是有道理的.我只是不确定如何允许用户改变帖子类别的方式.

关于如何最好地解决这个问题的想法?我看错了吗?

更新:希望更多地澄清我的担忧.

假设我在Post,我是否需要以下内容:

def create
  @post = Post.new(params[:category])

  @post.user_id = current_user.id

  # CHECK HERE IF REQUESTED CATEGORY_ID IS OWNED BY USER

  # continue on as normal here
end
Run Code Online (Sandbox Code Playgroud)

这似乎很多工作?我需要在更新和创建操作中检查每个控制器上的内容.请记住,不仅有一个belongs_to关系.

security ruby-on-rails mass-assignment

5
推荐指数
2
解决办法
1005
查看次数

Mongoid:如何防止通过批量分配创建未定义的字段?

这是代码:

class M
  include Mongoid::Document
  field :name
end

params = { name: "foo", age: 20 }
M.create(params)
#=> #<M name: "My Name", age: 20>
Run Code Online (Sandbox Code Playgroud)

请注意,age未定义但已保存.

这是有问题的(可能是DoS的来源),因为恶意用户可以在POST中添加任何参数,并且大字符串可以潜入未知字段.(例如name=foo&bogus=#{'x'*1000000})

到目前为止,我无法找到任何东西,但attr_accessible,但你必须保持在两个相同的字段名称它不是Mongoid真正伟大fieldattr_accessible所有的时间,所有车型.不干.

我认为attr_accessibleAPI非常适合ActiveRecord,因为有一个.您没有明确定义模型(DRY)和b中的字段.保证不存在将不存在的字段保存到RDB的可能性.但对于Mongoid,我认为应该有一个更好的解决方案attr_accessible.

请注意,有一个全局配置设置,allow_dynamic_fields但它不是关于质量分配,所以它超出了本讨论的范围,但是我认为它实际上应该是一个每个模型的宏,并且还应该注意质量分配.

你是如何处理这个问题的?

ruby-on-rails mass-assignment mongoid

5
推荐指数
1
解决办法
821
查看次数

请使用新建议的params保护模型(strong_parameters)或将`protected_attributes`添加到gemfile中

当我向我的Relationship模型添加attr_accessible时发生了这种情况.

class Relationship < ActiveRecord::Base
  attr_accessible :followed_id
end
Run Code Online (Sandbox Code Playgroud)

不使用Devise或protected_attributes gem,这有什么办法?我知道在控制器中你调用一个需要和允许字段的私有方法.这也是你应该在模型中做的事吗?这里的约定是什么?

谢谢!

ruby-on-rails whitelist mass-assignment attr-accessible devise

5
推荐指数
1
解决办法
4930
查看次数

当我们只更新一个属性时,我们应该使用强对数吗?

我正在开发一个Rails应用程序,我有几个动作(#delete_later,#ban_later等),其中我只从请求参数设置一个属性(具体来说,是reason执行该操作的字段).

我想知道是否可以这样做:

def ban_later
  @object.reason = params[:object][:reason]
  @object.save
end
Run Code Online (Sandbox Code Playgroud)

或者即使在这种情况下使用强对数也是最佳做法?

def ban_later
  @object.reason = object_params[:reason]
  @object.save
end

private
  def object_params
    params.require(:object).permit(:permitted_1, :permitted_2, :reason)
  end
Run Code Online (Sandbox Code Playgroud)

哪种解决方案最好?如果没有,那么问题的最佳解决方案是什么?

后来编辑:

#ban_later,#delete_later动作确实可以设置一个标志列,status但是可以在不从params散列中接收它的值的情况下完成.由于您只为每个方法设置一个状态,因此当您在#delete_later时可以设置状态"pending_delete",当您在#ban_later时,可以设置"pending_ban"状态.

稍后编辑

为什么使用#save而不是update_attributes直接?假设您需要if @object.save发表声明.在false分支(对象未保存)上,您可能仍希望呈现使用其内容的视图@object.

ruby ruby-on-rails mass-assignment strong-parameters

5
推荐指数
1
解决办法
1201
查看次数