这对我来说很奇怪,所以我只是好奇是否有其他人遇到过这个问题:
我有以下内容:
def credential_params
params.required(:credential).permit(:name,:agent_ids)
end
Run Code Online (Sandbox Code Playgroud)
在我的控制器中创建和更新动作我正在使用上述参数调用的质量赋值...
@credential.update_attributes(credential_params)
Run Code Online (Sandbox Code Playgroud)
但我还是得到了 Unpermitted parameters: agent_ids
如果我改变它params.required(:credential).permit!(即允许所有)当然它是有效的.
我觉得我必须在这里忽略一些明显的问题...任何人都知道它可能是什么?
我有一个并且属于许多关系设置,如下所示:
has_and_belongs_to_many :players, :class_name => "User" # In app/models/team.rb
has_and_belongs_to_many :teams # In app/models/user.rb
Run Code Online (Sandbox Code Playgroud)
在创建用户之后,我正在使用表单来创建团队.这是我的团队控制器:
def create
@team = Team.create(team_params)
end
private
def team_params
params.require(:team).permit(:name,:captain,:season,:year,:active,:player_ids)
end
Run Code Online (Sandbox Code Playgroud)
除了玩家(用户)之外,一切都会保存.以下是控制台上的输出:
Started POST "/teams" for 127.0.0.1 at 2013-10-20 01:46:04 -0400
Processing by TeamsController#create as HTML
Parameters: {"utf8"=>"?", "authenticity_token"=>"jhNUgdfSVNxBgpZkmvjSQg/7DGsV1ts+Y1a1xWQ6A1Y=", "team"=>{"name"=>"uuuuu", "captain"=>"18", "season"=>"Summer", "year"=>"2013", "player_ids"=>["", "18"]}, "button"=>""}
User Load (1.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = 18 ORDER BY "users"."id" ASC LIMIT 1
Unpermitted parameters: player_ids
(0.2ms) BEGIN
SQL (3.4ms) INSERT INTO "teams" ("captain", "created_at", …Run Code Online (Sandbox Code Playgroud) 我有一个使用所有常用属性创建用户模型的表单,但是我还传递了许多非模型属性,基于这些属性,我将在控制器操作中创建更多内容。
我的问题是如何告诉“强参数”接受用户数据以及与用户数据库无关的其他数据?
为了说明这一点,我的表单可能是这样的(为简洁起见删除了提交按钮):
<%= form_for @user do |f| %>
<%= f.text_field 'attribute1' %>
<%= f.text_field 'attribute2' %>
<%= f.text_field 'attribute3' %>
<%= text_field_tag 'attribute_not_on_user_model1' %>
<%= text_field_tag 'attribute_not_on_user_model2' %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
如何使用强参数来执行此操作?我尝试了这个:
params.require(:user).permit(:attribute1, :attribute2 , :attribute3, :attribute_not_on_user_model1,
attribute_not_on_user_model2)
Run Code Online (Sandbox Code Playgroud)
还有这个:
params.require(:user).permit(:attribute1, :attribute2 ,
:attribute3).require(:attribute_not_on_user_model1,
attribute_not_on_user_model2)
Run Code Online (Sandbox Code Playgroud)
两者都不起作用。我知道可以attr_accessor在用户中使用,但是这种形式的属性列表越来越多,这些属性本身与用户模型无关(但是对于创建用户模型及其后续相关模型而言必不可少) 。我们可能会争论这不是执行此操作的最佳方法(会想到一个表单对象),但目前我想看看Strong Parameters是否可以在这里帮助我。
我使用rails 4和嵌套表单和强参数.
我需要从一个表单更新多个模型.
这就是我宣布强大参数的方式.从父控制器.该协会是的has_many和belongs_to的顺序去Rundatum->材料 - > ParticleSize
def rundatum_params
params.require(:rundatum).permit( :material, :company_id, :material_density, :feed_moisture, :date, :building, :machine, :material_weight, :time_mins, :rate_lb_hr, :mill_amps, :class_amps, :mill_liner, :beater_plate_size, :mill_rpm, :class_rpm, :feeder_type, :feeder_setting, :feeder_aug_diameter, :tlgs_set, :air_pressure, :temp_mill_out, :temp_prod_out, :temp_ambient,
materials_attributes: [:id, :name, :density, :msds_url, :moisture, :notes, :_destroy],
particle_sizes_attributes: [:id, :screen, :percent_through, :percent_retained, :_destroy])
end
Run Code Online (Sandbox Code Playgroud)
rails服务器的输出是:
Rundatum Load (0.6ms) SELECT "rundata".* FROM "rundata" WHERE "rundata"."id" = $1 LIMIT 1 [["id", 7]]
Unpermitted parameters: particle_sizes_attributes
Run Code Online (Sandbox Code Playgroud)
从一个表单更新多个模型时,声明强参数的方法是什么?
谢谢
我似乎遗漏了一些明显的东西,但我无法允许嵌套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
Run Code Online (Sandbox Code Playgroud)
validates :title, :grid_size, presence: true
validates_associated :grid_size
has_one :grid_size
accepts_nested_attributes_for :grid_size
Run Code Online (Sandbox Code Playgroud)
POST /api/crosswords.json HTTP/1.1
X-Accept: application/crosswords.v1
Content-Type: application/json
Host: localhost:3000
Connection: close
User-Agent: Paw/2.1 (Macintosh; OS X/10.10.0) GCDHTTPRequest
Content-Length: 83
{"crossword":{"title":"My Aweosme Crossword","grid_size":{"rows":15,"columns":15}}}
Run Code Online (Sandbox Code Playgroud)
Started POST "/api/crosswords.json" for 127.0.0.1 at 2014-12-19 11:05:13 -0500 …Run Code Online (Sandbox Code Playgroud) 关于嵌套参数有很多问题,但我似乎无法找到解决我特定的简单情况的问题.
我正在尝试允许不是数组的嵌套哈希.我希望这可行:
params.require(:book).permit(:title, :description, style: {:font, :color})
Run Code Online (Sandbox Code Playgroud)
但它导致语法错误.
然而,这有效:
params.require(:book).permit(:title, :description, style: [:font, :color])
Run Code Online (Sandbox Code Playgroud)
但我的问题是,它似乎允许style值为具有属性的项目数组:font和:color.我只想允许具有这两个属性的单个哈希.
我尝试了其他变体,但我不断收到语法错误.我很感激任何帮助.
上下文:Rails 4.1.7,Ruby 2.0.0(它在我的todo列表中进行升级!),而不是使用ActiveRecord.
这些字段是通过迁移添加的,并且创建了视图的表单,但控制器会在从视图到模型的路径上过滤参数.无论我做什么,我的参数总是不允许的.我的控制器代码
#应用程序/控制器/用户/ registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
before_filter :configure_sign_up_params, only: [:create]
before_filter :configure_account_update_params, only: [:update]
protected
# If you have extra params to permit, append them to the sanitizer.
def configure_sign_up_params
devise_parameter_sanitizer.for(:sign_up)<<[:first_name,:last_name,:profile_image,:graduation_year]
end
# If you have extra params to permit, append them to the sanitizer.
def configure_account_update_params
devise_parameter_sanitizer.for(:account_update)<<[:first_name,:last_name,:profile_image,:graduation_year]
end
end
end
Run Code Online (Sandbox Code Playgroud)
#配置/ routes.rb中
Rails.application.routes.draw do
#...
devise_for :users, controllers: { account_update: "users/registrations", sign_up:"users/registrations" }
end
Run Code Online (Sandbox Code Playgroud)
#错误
Parameters: {"utf8"=>"?", "authenticity_token"=>"Qts15L3n6Xvsn0hwNvIUI6UrWUQyV/qEyoQAZ8M+udMK1RBTQS1XoNWgpg1JrXqWpb9NbrsaHtQVVU8XMwoSIQ==",
"user"=>{"first_name"=>"a", "last_name"=>"a",
"profile_image"=>#<ActionDispatch::Http::UploadedFile:0x00000004fe0bb0 @tempfile=#<Tempfile:/tmp/RackMultipart20150709-4420-12guerh.jpeg>, @original_filename="test1.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"user[profile_image]\"; filename=\"test1.jpeg\"\r\nContent-Type: …Run Code Online (Sandbox Code Playgroud) 在使用Rails 4.1.0和Ruby 2.1.0的 Rails应用程序中,
我一直在使用Authlogic对用户进行身份验证.
在users_controller.rb,我有一个创建方法,如下所示.
def create
@user = User.new(user_params) #this line has the error
respond_to do |format|
if @user.save
format.html { redirect_to_target_or_default account_url, notice: 'User was successfully created.' }
else
format.html { render action: 'new' }
end
end
end
Run Code Online (Sandbox Code Playgroud)
由于强烈建议在Rails 4.0中使用强参数,attr_accessible因此从User模型和下面的代码中删除了添加到users_controller.rb的给定代码.
private
# Never trust parameters from the scary internet, only allow the white list through.
def user_params
params.require(:user).permit(:login, :email, :password, :password_confirmation, :role_ids)
end
Run Code Online (Sandbox Code Playgroud)
User.rb …
ruby ruby-on-rails ruby-on-rails-3 strong-parameters ruby-on-rails-4
我查看了几个教程,ruby指南和几个stackoverflow问题.我首先尝试使用simple_form,现在是老式的方式,无法弄清楚为什么params没有通过.
控制器:
def new
@topgem = Topgem.new
end
def create
@topgem = Topgem.new(topgem_params)
if @topgem.save
redirect_to @topgem
else
render 'new'
end
Run Code Online (Sandbox Code Playgroud)
...
private
def topgem_params
params.require(:name).permit(:url, :description, :downloads, :last_updated)
end
Run Code Online (Sandbox Code Playgroud)
模型:
class Topgem < ActiveRecord::Base
has_many :votes
has_many :users, through: :votes
validates :name, presence: true, uniqueness: true, :length => {
:minimum =>2,
:maximum =>50}
validates :url, presence: true
validates :description, presence: true
validates :downloads, numericality: { only_integer: true }
end
Run Code Online (Sandbox Code Playgroud)
new.html.erb
<%= form_for(@topgem) do |f| %>
<%= f.label :name %>: …Run Code Online (Sandbox Code Playgroud) 3/13更新:
我用我的模型,控制器逻辑和几个表单版本做了一个小样本项目.
我正在构建一个表单,用户可以在其中添加"任务"和"里程碑".(即.任务='真空'在里程碑里面''干净的房子').它基本上是一个任务/子任务类型模型,父级为"里程碑",子级为"任务".
任务和里程碑都属于"项目"....所以我试图通过嵌套表单添加任务和里程碑以及更新操作.我想要的方法是为每个@task_template实例创建一个表单并一次更新多个表单.
我的问题是我也试图通过名为"MilestoneTemplates"和"TaskTemplates"的表动态设置"启动里程碑/任务"....
用户提取"添加里程碑/任务"页面,并根据其类型项目,他们在复选框旁边看到一系列预建任务(@task_templates)和里程碑(@milestone_templates).然后,用户检查他们要添加的任务或里程碑旁边的复选框.这应该为用户创建一个具有预建@ task_template.name,@ task_template.description ...等的特定任务
我甚至无法创建1.我正在使用Rails 4,我认为我已经正确设置了我的strong_params.以下是我对此的看法:
楷模:
class Task < ActiveRecord::Base
belongs_to :user
belongs_to :project
belongs_to :milestone
class Milestone < ActiveRecord::Base
belongs_to :project
belongs_to :user
has_many :tasks, dependent: :destroy, inverse_of: :milestone
accepts_nested_attributes_for :tasks, allow_destroy: true
class Project < ActiveRecord::Base
has_many :milestones, dependent: :destroy
has_many :tasks, dependent: :destroy
accepts_nested_attributes_for :tasks, allow_destroy: true
accepts_nested_attributes_for :milestones, allow_destroy: true
#the "Starter Milestones & Tasks"
class MilestoneTemplate < ActiveRecord::Base
has_many :task_templates, dependent: :destroy, inverse_of: :milestone_template
class TaskTemplate < ActiveRecord::Base
belongs_to …Run Code Online (Sandbox Code Playgroud) forms checkbox ruby-on-rails nested-attributes strong-parameters