假设你有这个结构:
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.
user_ids直接填充params哈希(它们非常嵌套)
user_ids不可批量分配user_id必须存在有任何体面的方式吗?
我阅读了很多相关的帖子,但找不到为什么它不适合我.我还有一个"无法大量分配受保护的属性:个人资料"......我做错了什么?
我有一个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
我是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个产品,这需要两分钟左右,这是很多时间.
我想知道是否有一种方法可以为产品阵列分配类别,而不是将产品分配到类别或可以优化的东西,花费更少的时间.
我刚刚更新到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
我需要存储恰好三个页面,在通过形式一次。我希望以与模型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模型实例,然后将它们循环以保存每个实例。另外,我也不想使用数据库插入,因为它不会自动更新记录时间戳。
我有一个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) 我一直在阅读关于rails安全问题的内容,而让我最关心的是大规模分配.我的应用程序正在使用attr_accessible,但是我不确定我是否完全知道处理暴露关系的最佳方法是什么.假设我们有一个基本的内容创建/所有权网站.用户可以创建博客帖子,并且具有与该博客帖子相关联的一个类别.
所以我有三个型号:
我允许在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关系.
这是代码:
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真正伟大field和attr_accessible所有的时间,所有车型.不干.
我认为attr_accessibleAPI非常适合ActiveRecord,因为有一个.您没有明确定义模型(DRY)和b中的字段.保证不存在将不存在的字段保存到RDB的可能性.但对于Mongoid,我认为应该有一个更好的解决方案attr_accessible.
请注意,有一个全局配置设置,allow_dynamic_fields但它不是关于质量分配,所以它超出了本讨论的范围,但是我认为它实际上应该是一个每个模型的宏,并且还应该注意质量分配.
你是如何处理这个问题的?
当我向我的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
我正在开发一个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.
mass-assignment ×10
nested-forms ×2
ruby ×2
categories ×1
devise ×1
eloquent ×1
fortify ×1
java ×1
laravel-5.2 ×1
magento ×1
mongoid ×1
product ×1
rails-admin ×1
security ×1
spring ×1
spring-mvc ×1
whitelist ×1