Tag: 强参数

强参数 – 无法访问深层嵌套属性

一个StackOverflow问题询问了我需要什么,但自我答案并没有帮助我知道下一步该做什么。 在那个问题中呈现的场景( 在铁轨中将深层嵌套的强参数列入白名单 )几乎就是我所发生的事情,但我会发布一个我的缩写(仍然很长)并希望有人 – 甚至可能是戴夫post – 可以帮助(我没有足够的声誉评论和问他)。 关于嵌套的强参数的链接很少,我还没有读过,我在许多控制器和API端点上处理了一些,但这是应用程序中最复杂的。 (我包含了这么长的例子,所以你可以看到完整的复杂性。) 这是在sales_controller ,我们无法获得的属性之一是timezone_name ,它位于run_spans_attributes ,位于sale下的options_attributes 。 我已经尝试了几乎所有与嵌入式属性匹配的不同语法方法,这些方法在StackOverflow上有强参数问题,但没有一种方法有效。 我需要更多课程吗? 有魔术括号吗? 我需要新的建议。 请。 应该注意的是,这是使用strong_parameters gem和Rails 3.2.21,但我希望为Rails 4准备应用程序,所以我希望避免短期解决方案。 对不起,这么久了: Parameters: “sale”=>{ “cloned_from”=>””, “type”=>”Localsale”, “primary_contact_attributes”=>{ “primary”=>”true”, “first_name”=>”Fred”, “id”=>”1712” }, “contract_signed_on”=>”March 20, 2015”, “billing_addresses_attributes”=>{ “0”=>{ “billing”=>”1”, “city”=>”San Diego”, “id”=>”29076” } }, “other_contacts_attributes”=>{ “0”=>{ “first_name”=>”Fred”, “_destroy”=>”false”, “id”=>”170914” }, “1”=>{ “first_name”=>”Fred”, “last_name”=>”Smith”, “_destroy”=>”false”, […]

嵌套has_one关联的强参数

我似乎错过了一些明显的东西,但我无法允许嵌套的has_one关联的属性。 控制器: def create @crossword = Crossword.new(crossword_params) if @crossword.save render :show, status: :created, location: [:api, @crossword] else render json: @crossword.errors, status: :unprocessable_entity end end def crossword_params params.require(:crossword).permit(:title, :grid_size, grid_size_attributes: [:rows, :columns]) end 模型: validates :title, :grid_size, presence: true validates_associated :grid_size has_one :grid_size accepts_nested_attributes_for :grid_size 请求: POST /api/crosswords.json HTTP/1.1 X-Accept: application/crosswords.v1 Content-Type: application/json Host: localhost:3000 Connection: […]

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

我正在开发一个Rails应用程序,我有几个操作(#delete_later,#ban_later等等),我只从请求参数中设置一个属性(具体来说,是执行该操作的reason字段)。 我想知道是否可以这样做: def ban_later @object.reason = params[:object][:reason] @object.save end 或者即使在这种情况下使用强对数也是最佳做法? 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 哪种解决方案最好? 如果没有,那么问题的最佳解决方案是什么? 后来编辑: #ban_later,#delete_later操作确实可以设置标志列status但是可以在不从params散列中接收它的值的情况下完成。 由于您只为每个方法设置一个状态,因此当您在#delete_later时可以简单地设置状态“pending_delete”,当您在#ban_later时,可以设置“pending_ban”。 后来编辑 为什么直接使用#save而不是update_attributes ? 假设你需要一个if @object.save语句。 在false分支(对象未保存)上,您可能仍希望呈现使用该@object内容的视图。

如何制作一个可选的强参数键仍然可以过滤嵌套在其中的参数?

我在我的控制器中有这个: params.require(:item).permit! 让我们假设这个rspec规范: put :update, id: @item.id, item: { name: “new name” } 它按预期工作,没有错误。 但是,如果我使用这个: put :update, id: @item.id, item: nil 我得到了ActionController::ParameterMissing ,我不想得到它。 它与我用于其他操作的控制器宏有关,通过它我无法控制发送的参数(宏检查用户凭据,因此我并不真正关心实际测试#update操作,而是我只是测试before_filters for it)。 所以我的问题是: 如何使params[:item]可选,但如果它存在,仍然在其中过滤属性?

强参数:未允许的参数:has_many_through关系中的标记

我有几个型号/控制器: event.rb: class Event < ActiveRecord::Base belongs_to :category belongs_to :user has_many :event_tags has_many :tags, through: :event_tags has_many :event_skills has_many :skills, through: :event_skills tag.rb class Tag < ActiveRecord::Base has_many :events, through: :event_tags has_many :event_tags end event_tag.rb class EventTag < ActiveRecord::Base belongs_to :event belongs_to :tag end user.rb: class User < ActiveRecord::Base has_many :events # organized_events events_controller.rb class […]

Rails 4强参数,无需参数

我正在使用Rails 4,我不知道在没有必要参数的情况下使用强参数的最佳方法是什么。 那就是我做的: def create device = Device.new(device_params) …………….. end private def device_params if params[:device] params.require(:device).permit(:notification_token) else {} end end 我的设备型号不validation任何内容的存在。 我知道我也可以这样做: device = Device.new device.notification_token = params[:device][:notification_token] if params[:device] && params[:device][:notification_token] 有没有任何约定或正确的方法呢?

CanCan load_and_authorize_resource触发禁止的属性

我有一个使用强参数的标准RESTful控制器。 class UsersController < ApplicationController respond_to :html, :js def index @users = User.all end def show @user = User.find(params[:id]) end def new @user = User.new end def edit @user = User.find(params[:id]) end def create @user = User.new(safe_params) if @user.save redirect_to @user, notice: t('users.controller.create.success') else render :new end end def update @user = User.find(params[:id]) if @user.update_attributes(safe_params) […]

为什么切割params散列会对质量分配造成安全问题?

通过批量分配来防止安全风险的官方方法是使用attr_accessible 。 但是,一些程序员认为这不是模型的工作(或者至少不仅仅是模型的工作)。 在控制器中执行此操作的最简单方法是切割params哈希: @user = User.update_attributes(params[:user].slice(:name)) 但是文档说明: 请注意,使用Hash#except或Hash#slice代替attr_accessible来清理属性将无法提供足够的保护。 这是为什么? 为什么白名单切片的params不能提供足够的保护? 更新: Rails 4.0将发布强参数 ,一个精细的参数切片,所以我猜整个切片的事情毕竟不是那么糟糕。

在rails控制台中创建实例时,Rails 4强参数失败

可能在这里做一些蠢事,但这是我的基本cookie切割器类: class League < ActiveRecord::Base private def league_params params.require(:full_name).permit! end end 在创建联盟的新实例时: 2.0.0-p0 :001 > l = League.new(full_name: ‘foo’, short_name: ‘bar’) WARNING: Can’t mass-assign protected attributes for League: full_name, short_name 我到底错在了什么? 这是一个Rails 4.0.0.beta1 build + Ruby 2.0 **更新** 我现在意识到强大的参数现在在Controller中实施而不是在模型中。 最初的问题仍然存在。 如果在控制器级别允许它们,如果我在Rails控制台中创建实例,如何正确地将属性列入白名单? 在这种情况下我是否还需要使用attr_accessible ,从而完全复制哪些强参数试图“修复”?

强参数不接受数组

我在我的视图中有这个多选复选框 模型 class User :destroy accepts_nested_attributes_for :user_roles, :allow_destroy => true has_many :roles, :through => :user_roles end 视图 这个强大的参数写成 def user params.require(:user).permit(:first_name,{:role_ids => []}) end 但在创造它说 Processing by Admin::UsersController#create as HTML Parameters: {“utf8″=>”✓”, “authenticity_token”=>”+y8iWya5KIILqS0embEUEZuClycXq0O9Q4pA+MnbM0g=”, “user”=>{“first_name”=>””, “last_name”=>””, “email”=>”a@loclahost.com”, “language”=>”en”, “access_level_id”=>”1”, “role_ids”=>[“”, “1”, “”, “5”, “”, “”, “”], “password”=>”[FILTERED]”, “password_confirmation”=>”[FILTERED]”}, “commit”=>”Create user”} Unpermitted parameters: role_ids Unpermitted parameters: role_ids […]