我是Ruby on Rails环境的新手,也是我能够解决的大多数问题,但我还没有找到解决这个问题的方法.
提供上下文:
我的问题
当我使用Devise的注册签署新用户时.:name字段未添加到数据库中.请参阅服务器输出
用户模型(app/models/user.rb)
:name包含在attr_accessible中.
class User < ActiveRecord::Base
rolify
# Include default devise modules. Others available are:
# :token_authenticatable, :confirmable,
# :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
# Setup accessible (or protected) attributes for your model
attr_accessible :role_ids, :as => :admin
attr_accessible :name, :email, :password, :password_confirmation, :remember_me
end
Run Code Online (Sandbox Code Playgroud)
用户控制器(app/controllers/users_controller.rb).
为了与Rails 4保持一致,我添加了params白名单,但这并没有解决问题.
class UsersController < ApplicationController
before_filter :authenticate_user!
def index
authorize! :index, …Run Code Online (Sandbox Code Playgroud) authentication ruby-on-rails devise strong-parameters ruby-on-rails-4
我想在Rails 4.0.0应用程序中使用Paperclip将视频文件添加到Episode模型中.但是,当我在创建操作(第二行)中调用episode_params时,我收到错误"没有将符号隐式转换为哈希":
def create
@episode = Episode.new(episode_params)
respond_to do |format|
if @episode.save
format.html { redirect_to @episode, notice: 'Episode was successfully created.' }
format.json { render action: 'show', status: :created, location: @episode }
else
format.html { render action: 'new' }
format.json { render json: @episode.errors, status: :unprocessable_entity }
end
end
Run Code Online (Sandbox Code Playgroud)
结束
我的episode_params方法:
def episode_params
params.require(:episode).permit(:name, :number, :description, :tag_list, :video => [:tempfile, :original_filename, :content_type, :headers])
end
Run Code Online (Sandbox Code Playgroud)
并且参数哈希:
{"utf8"=>"?", "authenticity_token"=>"VbOJvzWjlXMHOYpYMkwXUfdUxm9OcQx3LTMIJzk5eJQ=", "episode"=>{"name"=>"Test Episode 2", "number"=>"2", "description"=>"Testing Paperclip with video files", "tag_list"=>"test, file, video", "video"=>#<ActionDispatch::Http::UploadedFile:0x007fec361a80e0 …Run Code Online (Sandbox Code Playgroud) Rails 4:我想用标签创建Person
person = Person.new(:name=>Jon', :tags_attributes=>[{:id=>'15', :name=>'some_tag'}])
Run Code Online (Sandbox Code Playgroud)
我的人模型:
class Person < ActiveRecord::Base
validates :name, presence: true
belongs_to :user
has_many :organizations, through: :people_organizations
has_and_belongs_to_many :tags, join_table: :people_tags
has_many :phones, as: :phoneable, :dependent => :destroy
has_many :emails, as: :emaileable, :dependent => :destroy
has_many :networks, as: :networkable, :dependent => :destroy
has_many :messengers, as: :messengerable, :dependent => :destroy
accepts_nested_attributes_for :phones, :emails, :networks, :messengers, allow_destroy: true
accepts_nested_attributes_for :tags, reject_if: :all_blank
end
Run Code Online (Sandbox Code Playgroud)
我的PeopleController:
def create
@person = Person.new(person_params)
respond_to do |format|
if @person.save(validate: false)
format.json { …Run Code Online (Sandbox Code Playgroud) 我有两个问题:
在Rails 3中,您可以使用更新多个记录
Product.update(params[:products].keys, params[:products].values)
Run Code Online (Sandbox Code Playgroud)
你如何使用强参数在Rails 4中做同样的事情?如何同时创建多个记录?您能否通过以下格式的示例详细说明您的解决方案:
params = ActionController::Parameters.new(...)
Product.create!(params.require(...)permit(...)
Run Code Online (Sandbox Code Playgroud)
此外,我的产品模型有一个名为number的列,它等于它们更新的顺序.有没有办法在更新时将计数器值传递给数字?
谢谢.
在使用Rails 4强参数时,我正在努力寻找处理嵌套表单的正确和干燥方式.
我有一些模型,我在我的应用程序中以不同的方式重新使用,因此我有一些嵌套的表单.
问题是当我使用嵌套表单时,我不觉得我正在做DRYest方法.
考虑以下是AccountsController:
params.require(:account).permit(
person_attributes: [
:name,
address: [
:city
]
]
)
Run Code Online (Sandbox Code Playgroud)
从我的角度来看person_attributes,不应该进入AccountsController.我的意思是,AccountsController不应该对Person类有太多了解.
我想添加这样的允许属性,PeopleController但它是一个不能直接访问的私有方法.
现在我正在考虑将类允许的属性存储在类方法中,Person.permitted_attributes但我不确定这是否是一个聪明的设计决策.这样做我可以在几个地方使用它.我显然会为每个控制器编写单独的测试.
我理解参数过滤应该在控制器中完成,而不是在模型中完成,但我不确定添加代码重复是否是一个很好的权衡.
你们怎么看待这件事?
我有几个模型,每个模型有40个属性.它们被标准化,只是我们正在处理的模型必须具有多个属性.除此之外,它是一个非常标准的rails 4.2应用程序(从rails 3.2升级).该应用程序既可用于提供带有ajax调用的动态页面,也可用于json,因此可供各种json客户端使用.
所以请致电:http://example.com/products/1.json - 返回json和http://example.com/products/1返回haml-parsed视图.
我正在使用的JavaScript库(KendoUI)返回更新的整个记录,而不仅仅是更新的字段.目前没有办法避免,除非我想根据他们的支持论坛重写KendoUi Grid.
因此,用户可以搜索所有产品,并向她显示产品的所有属性,然后根据她的访问级别,她可以更新某些字段(几个定价点和描述),但是ajax请求包含所有属性.因此,我得到了ActiveModel :: ForbiddenAttributesError
我怎样才能正确(可以这么说的轨道)过滤掉更新后的参数?现在我正在对@ product.attributes && params [:product]进行哈希比较,以确定是否传递了更新/新属性..diff自Rails 4.0.2起已被弃用
我的管理员可以更改这些大型模型上的几乎所有属性(时间戳,ID和其他一些除外).最好的方法是做什么而不是做params [:product] .require(:base_cost).permit(:vendor_cost,:client_cost)30个奇数属性?如果应用程序处于开发状态并且属性发生变化,则很快就会成为维护这些列表的问题.我想我可以使用某种CONSTANT - ALLOWED_ATTRIBUTES或ADMIN_ATTRIBUTES和USER_ATTRIBUTES,并将其传递给permit.但有点感觉不Railsy?
json ruby-on-rails kendo-ui strong-parameters ruby-on-rails-4
我正在开发一个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.
我有一个供应商名称和电子邮件的基本表单设置.我想将我的地址属性嵌套到这个表单中,但我一直得到以下错误
未允许的参数:地址
class Supplier < ActiveRecord::Base
has_many :addresses, dependent: :destroy, as: :addressable
accepts_nested_attributes_for :addresses
end
class Address < ActiveRecord::Base
belongs_to :addressable, polymorphic: true
belongs_to :supplier
end
class SuppliersController < ApplicationController
def allowed_params
params.require(:supplier).permit(:name, :email, {:address_attributes => [:first_name, :last_name, :address1, :address2, :city, :zip_code, :country_id]})
end
end
Run Code Online (Sandbox Code Playgroud)
供应商表格
%fieldset#admin-supplier-names.span-12
%label Name
= form.text_field :name
%label Email
= form.text_field :email
= form.fields_for :address do |address_fields|
%li= address_fields.text_field :first_name, placeholder: :first_name.upcase, value: current_user.first_name
%li= address_fields.text_field :last_name, placeholder: :last_name, value: current_user.last_name
%li= address_fields.text_field :address1, placeholder: …Run Code Online (Sandbox Code Playgroud) 有两个items_controller,一个用于api(在app/controllers/api /中),一个用于后端(在app/controllers/backend中)
强参数很长(20个字段或者其他东西),并且提示稍微进化一下.在两个控制器中维护此列表并非不可能,但由于创建/更新操作的需求大致相同,我将考虑在一个单独的文件中共享强参数定义,该文件将共享给都
我试图用超级控制器继承这两个,只包括强参数定义:
class SharedItemsController < ApplicationController
private # not knowing all the prerequisites of this, I tried also using protected instead of private; same result
def item_params
....
end
end
end
class Frontend::ItemsController < SharedItemsController
...
end
class Api::ItemsController < SharedItemsController
...
end
Run Code Online (Sandbox Code Playgroud)
没有成功,我坚持使用未经许可的参数
希望在这里得到关于这个的一些提示; 最好
UsersProfileController具有强大的参数,如下所示:
def user_profile_params
params.permit(:age, :relations)
# yes, I am not requiring user_profile. Just permitting attributes I need.
end
Run Code Online (Sandbox Code Playgroud)
create动作通过父(has-one和belongs-to association)构建UserProfile
def create
parent = Parent.create_guest
parent.build_user_profile(user_profile_params)
if parent.save
# do something
else
# handle error
end
end
Run Code Online (Sandbox Code Playgroud)
在UserProfiles中调用params返回:
<ActionController::Parameters
{"age"=>"23",
"relations"=>"3",
"subdomain"=>"api",
"format"=>:json,
"controller"=>"api/v1/user_profiles",
"action"=>"create"}
permitted: false>
Run Code Online (Sandbox Code Playgroud)
调用user_profile_params,返回:
user_profile_params:
Unpermitted parameters: subdomain, format
<ActionController::Parameters
{"age"=>"23",
"relations"=>"3", }
permitted: true>
Run Code Online (Sandbox Code Playgroud)
当发布请求时,我希望能够使用user_profile_params中的白名单参数创建user_profile.相反,createUserProfiles中的操作失败,错误:Unpermitted parameters: subdomain, format.
这不是我的预期.我希望user_profile_params只包含允许的值并忽略所有其他值.
我可以添加:format和:subdomain列出允许的属性,但有些东西感觉有点不对劲.
有人可以解释发生了什么/我错过了什么?
ruby parameters ruby-on-rails strong-parameters ruby-on-rails-5
ruby ×2
devise ×1
forms ×1
json ×1
kendo-ui ×1
nested ×1
nested-forms ×1
paperclip ×1
parameters ×1