标签: strong-parameters

Rails 4&Devise - 创建新用户时,用户名不会添加到数据库中

我是Ruby on Rails环境的新手,也是我能够解决的大多数问题,但我还没有找到解决这个问题的方法.

提供上下文:

  • 使用rails(4.0.0)
  • 使用监狱长(1.2.3)
  • 使用设计(3.0.0)
  • 使用rolify(3.2.0)
  • 使用cancan(1.6.10)

我的问题

当我使用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

5
推荐指数
2
解决办法
7455
查看次数

在Rails 4中的视频文件上使用Paperclip - 强参数问题?

我想在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)

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

5
推荐指数
1
解决办法
635
查看次数

Rails 4,嵌套属性,对于ID =的人找不到ID =的标签

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)

nested strong-parameters ruby-on-rails-4

5
推荐指数
1
解决办法
1425
查看次数

使用Rails中的强参数一次创建或更新多个记录4

我有两个问题:


在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的列,它等于它们更新的顺序.有没有办法在更新时将计数器值传递给数字?

谢谢.

ruby-on-rails multiple-instances strong-parameters

5
推荐指数
1
解决办法
1698
查看次数

使用Rails 4强参数处理嵌套表单的DRY方式

在使用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但我不确定这是否是一个聪明的设计决策.这样做我可以在几个地方使用它.我显然会为每个控制器编写单独的测试.

我理解参数过滤应该在控制器中完成,而不是在模型中完成,但我不确定添加代码重复是否是一个很好的权衡.

你们怎么看待这件事?

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

5
推荐指数
1
解决办法
191
查看次数

Rails 4.2强大的参数和解析json put/update上的更改属性

背景

我有几个模型,每个模型有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

第1部分

我怎样才能正确(可以这么说的轨道)过滤掉更新后的参数?现在我正在对@ product.attributes && params [:product]进行哈希比较,以确定是否传递了更新/新属性..diff自Rails 4.0.2起已被弃用

第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

5
推荐指数
1
解决办法
467
查看次数

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

我正在开发一个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.

ruby ruby-on-rails mass-assignment strong-parameters

5
推荐指数
1
解决办法
1201
查看次数

接受带有表单的多个模型

我有一个供应商名称和电子邮件的基本表单设置.我想将我的地址属性嵌套到这个表单中,但我一直得到以下错误

未允许的参数:地址

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)

forms ruby-on-rails nested-forms strong-parameters

5
推荐指数
1
解决办法
270
查看次数

两个控制器之间的Rails /共享强参数定义

有两个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)

没有成功,我坚持使用未经许可的参数

希望在这里得到关于这个的一些提示; 最好

ruby-on-rails strong-parameters

5
推荐指数
1
解决办法
461
查看次数

强参数:params.permit返回未允许的参数,尽管白名单

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

5
推荐指数
1
解决办法
2682
查看次数