标签: strong-parameters

当多级accepts_nested_attributes_for时,Rails 4强参数

当我尝试保存具有多个accepts_nested_attribetus_for级别的模型时,我遇到了问题.

我的用例是有一个用户页面,用户可以在其中创建多个问题,每个问题也有多个答案.

发生的事情是,由于提交页面上可能存在多个问题,因此在提交时,用户的参数哈希值如下所示:

{"user"=>{"questions_attributes"=>{"0"=>{"desc"=>"question", "answers_attributes"=>{"0"=>{"ans"=>""}}}}}}
Run Code Online (Sandbox Code Playgroud)

因此,我得到的错误是"未经许可的参数:0".如何正确设置强参数权限,以便我可以正确保存所有模型?我可以循环解决问题,并单独保存每一个问题,但这样做有效,但我希望能有更清洁的方法.

user.rb

has_many :questions
accepts_nested_attributes_for :questions
Run Code Online (Sandbox Code Playgroud)

question.rb

belongs_to :user
has_many :answers
accepts_nested_attributes_for :answers
Run Code Online (Sandbox Code Playgroud)

answer.rb

belongs_to :question
Run Code Online (Sandbox Code Playgroud)

users_controller.rb

def update
    user = User.find_by_id params[:id]
    user.questions.create question_params(params[:user])
end

def question_params(params)
    params.require(:question_attributes).permit(:desc, {:answers_attributes => [:ans]}
end
Run Code Online (Sandbox Code Playgroud)

nested-attributes strong-parameters ruby-on-rails-4

7
推荐指数
1
解决办法
2394
查看次数

有没有办法重命名强参数键?

假设我在没有使用强参数的控制器中有代码

Model.create name: params[:name], alias_id: params[:foreign_id]
Run Code Online (Sandbox Code Playgroud)

我可以在这里使用强参数吗?

我不能做

Model.create params.require(:name, :foreign_id)
Run Code Online (Sandbox Code Playgroud)

因为foreign_id不是一个参数

我不能做

Model.create params.require(:name, :alias_id)
Run Code Online (Sandbox Code Playgroud)

因为alias_id不在模型上.

基本上,我想知道在使用强参数时是否可以使用参数键别名.

ruby-on-rails ruby-on-rails-3 strong-parameters ruby-on-rails-4

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

使用强参数自定义设计

我正在使用Rails 4.0.0和Devise 3.0.2并尝试在Devise README中按照此指令配置具有强参数的Devise.

我在这里写了这样的代码 application_controller.rb

class ApplicationController < ActionController::Base
  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :nick
  end
end
Run Code Online (Sandbox Code Playgroud)

然后我去了http://localhost:3000/users/sign_up.我有一个NoMethodError in Devise::RegistrationsController#new,说:

未定义的方法 <<' for {}:ActionController::Parameters

并指向我写的确切行 devise_parameter_sanitizer.for(:sign_up) << :nick

有什么我做错了吗?谢谢你的帮助.

ruby-on-rails devise strong-parameters ruby-on-rails-4

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

如何在接收ActiveModel :: ForbiddenAttributesError时找到该属性

使用strong_params并获取ActiveModel::ForbiddenAttributesError异常时,如何找出禁止的属性?我刚刚切换,attr_accessible调试消息通常很好,但切换到强params.

我收到此错误:

ActiveModel::ForbiddenAttributesError in SnippetsController#create
Run Code Online (Sandbox Code Playgroud)

这是一个嵌套模型.

def snip_params
  params.require(:snippet).permit(:content, :approved, :user_id, :book_id)
end
Run Code Online (Sandbox Code Playgroud)

在我用过的父母身上

has_nested_attributes :snippets
Run Code Online (Sandbox Code Playgroud)

创造

def create
  @snippet = @book.snippets.create(snip_params)
  @snippet.user = current_user
  if @snippet.save
    redirect_to @book
    flash[:success] = "Snippet submitted and awaiting approval."
  else
    flash[:base] = "Someone else has submitted a snippet, please try again later"
    redirect_to @book
  end
end
Run Code Online (Sandbox Code Playgroud)

参数内容:

{"utf8"=>"?",
 "authenticity_token"=>"bTRSwFRIhN3l3DkkWPtLzpoQHYD+CezmJQLw8Oz5+3g=",
 "snippet"=>{"content"=>"<p>AAAAAAAAAAAAA</p>\r\n"},
 "commit"=>"Create Snippet",
 "book_id"=>"1"}
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails strong-parameters

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

强参数和json输入轨道4

我试图通过JSON String保存数据,其中我有嵌套的关联属性.我不想使用attr_accessible.我几乎得到了强参数的逻辑,但仍然有问题使它们工作.我正在获取JSON字符串并使用它来使用它来保存数据

data = request.body.read
@inputData = Person.new(JSON.parse(data))
@inputData.save!
if@inputData.valid?
  render :status => 200, :json => "Data inserted successfully"
else
  render :status => 404, :json => "Not Inserted "
end
Run Code Online (Sandbox Code Playgroud)

我已经定义了permit strong参数方法允许这样的嵌套属性

def referral_params
params.require(:person).permit(:id, user_attributes: [:id, :first_name, :last_name, :email], device_attributes: [:id, :os_type, :os_version], location_attributes: [:id, :latitude, :longitude], duration_attributes[:id, :start_time, :end_time]) end
Run Code Online (Sandbox Code Playgroud)

但我不知道如何使用此regerral_params方法以及JSON输入字符串....

json ruby-on-rails nested-attributes strong-parameters ruby-on-rails-4

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

强参数和多维数组

我正在使用Rails 3.2.6强参数 gem.

所以,我有一个具有典型更新操作的控制器:

# PUT /api/resources/:id
def update
  @resource.update_attributes! permited_params
  respond_with_json @resource, action: :show
end
Run Code Online (Sandbox Code Playgroud)

然后,我有permited_params方法

def permited_params
  params.permit(:attr1, :attr2, :attr3)
end
Run Code Online (Sandbox Code Playgroud)

问题是这:attr3是一个多维数组,如下所示:[[1, 2], [2, 5, 7]]

在文档之后,我需要指定:attr3为数组.但...

params.permit(:attr1, :attr2, :attr3 => [])
#inspecting permited_params: {"attr1"=>"blah", "attr2"=>"blah"}

params.permit(:attr1, :attr2, :attr3 => [[]])
#inspecting permited_params: {"attr1"=>"blah", "attr2"=>"blah", "attr3" => []}

params.permit(:attr1, :attr2, :attr3 => [][])
#throw error
Run Code Online (Sandbox Code Playgroud)

问题是:如何在多维数组中使用强参数?

ruby-on-rails multidimensional-array ruby-on-rails-3.2 strong-parameters

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

仅允许Rails强参数中的某些可能值

我有一个带有用户模型的rails应用程序,它可以有多个角色.我使用像这样的位掩码实现了这个:

class User < ActiveRecord::Base
  DEFAULT_ROLES = %w[developer entrepreneur]
  ROLES = ['admin', 'entrepreneur', 'developer']

  def has_role?(role)
    roles.include?(role.to_s)
  end

  def is?(role)
    has_role?(role)
  end

  def roles=(roles)
    self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
  end

  def roles
    ROLES.reject do |r|
      ((roles_mask.to_i || 0) & 2**ROLES.index(r)).zero?
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

在应用的注册页面中,我希望用户选择他们是"企业家"还是"开发者".但是,我想确保他们无法为自己(或任何其他人)分配任何其他角色,除非他们已经是管理员.

我的第一个想法是在roles=方法中通过改变它看起来像这样做

  def roles=(roles)
    unless current_user.is?(:admin)
      validates_inclusion_of roles, :in => DEFAULT_ROLES
     end
    self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
  end
Run Code Online (Sandbox Code Playgroud)

但是,正如我发现的那样,你无法current_user从模型内部进行访问(如果你考虑它我觉得有意义......)

我的下一次尝试是看看我是否可以使用强参数来做到这一点.

我期待它看起来像这样(我正在使用设计,覆盖RegistrationsController) …

validation ruby-on-rails strong-parameters ruby-on-rails-4.2

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

Rails强烈的params,名字中带有"dot"

我需要在Rails 4中允许一个参数,它的名字中有一个点:

我的params哈希看起来如下:

{
  "dictionary_objects.id" => [
    "102", "110", "106"
  ]
}
Run Code Online (Sandbox Code Playgroud)

我可以得到参数值:

>> params['dictionary_objects.id']
=> [
 [0] "102",
 [1] "110",
 [2] "106"
]
Run Code Online (Sandbox Code Playgroud)

但是当我尝试允许它时,它返回一个空哈希:

 >> params.permit('dictionary_objects.id')
 Unpermitted parameters: dictionary_objects.id
 => {}
Run Code Online (Sandbox Code Playgroud)

有谁知道我怎么能在它的名字上留下一个带点的params?

谢谢.

ruby ruby-on-rails strong-parameters ruby-on-rails-4

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

Rails 4 - 使用scaffold的强参数 - params.fetch

我使用scaffold命令在我的Rails 4应用程序中制作我的组件.

最近,设置强params的方法中使用的术语已经从params.require变为params.fetch,现在设置中有花括号.

private
    # Never trust parameters from the scary internet, only allow the white list through.
    def engagement_params
      params.fetch(:engagement, {})
    end
Run Code Online (Sandbox Code Playgroud)

我找不到任何解释变更或如何使用它的文档.

我还可以将params.fetch(:engagement).permit(:opinion)写入fetch命令吗?我不知道如何处理花括号.

如何使用这种新的表达方式完成强大的参数?

controller ruby-on-rails scaffolding strong-parameters

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

为什么我的参数哈希为零?

在我的 Rails 控制器中,在窥探会话中,我的params哈希值是nil. request.params具有预期的哈希值。

\n\n

如果我注释掉该params = \xe2\x80\xa6行,params则恢复正常。

\n\n
class UsersController < Clearance::UsersController\n  skip_before_filter :verify_authenticity_token\n\n  def update\n    binding.pry\n    params = params.require(:user).allow(:foo)\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

可能是什么原因造成的?

\n

ruby-on-rails rails-console pry strong-parameters

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