当我尝试保存具有多个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) 假设我在没有使用强参数的控制器中有代码
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
我正在使用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
有什么我做错了吗?谢谢你的帮助.
使用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) 我试图通过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
我正在使用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
我有一个带有用户模型的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
我需要在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?
谢谢.
我使用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命令吗?我不知道如何处理花括号.
如何使用这种新的表达方式完成强大的参数?
在我的 Rails 控制器中,在窥探会话中,我的params哈希值是nil. request.params具有预期的哈希值。
如果我注释掉该params = \xe2\x80\xa6行,params则恢复正常。
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\nRun Code Online (Sandbox Code Playgroud)\n\n可能是什么原因造成的?
\n