标签: strong-parameters

使用Rails 4,强参数和Carrierwave上传文件

我正在移植一个使用Carrierwave到Rails 4的应用程序,但我遇到了强大的params问题.我有一个模特

accepts_nested_attributes_for :photos
Run Code Online (Sandbox Code Playgroud)

以下是上传图片的传递方式:

{
    # ...
    "model"=>
    {
        # ...
        "photos_attributes"=>
        {
            "1362752177921"=>
            {
                "image"=>"test.jpg",
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我似乎无法弄清楚如何编写将接受的参数photos_attributes.

我试过.permit(photos_attributes: [])但它只是跳过它们,当我使用时permit!,uuid在保存之前创建的不会出现在SQL中,这是第二个问题:

photos.uuid may not be NULL: INSERT INTO "photos" ("created_at", "model_id", "image", "title", "updated_at") VALUES (?, ?, ?, ?, ?)
Run Code Online (Sandbox Code Playgroud)

这里缺乏强参数的文档,我甚至不确定如何继续.

更新 这适用于嵌套属性:

params.permit( ..., :photos_attributes => ['id', 'title', 'image', '_destroy'])
Run Code Online (Sandbox Code Playgroud)

但是看起来像Carrierwave或Nested Form应该先为Rails 4更新.它只是试图一直保存一个空图像.相同的代码(没有strong_params)在Rails 3中有效.

file-upload nested-forms carrierwave strong-parameters ruby-on-rails-4

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

Rails 4:设置request.format不更新params [:format]

在Rails 3中,paramsrequest.parameters引用相同的对象.

通过在Rails 4中添加强参数,params现在引用ActionController::Parameters了从中创建的独特实例request.parameters.

这样做的副作用是,一旦调用params(从而创建不同的Parameters对象),调用request.format=将不会更新params.

Rails 3:

params # set @_params to request.parameters
request.format = "mobile"
params[:format]
=> "mobile"
Run Code Online (Sandbox Code Playgroud)

导轨4:

params # set @_params to Parameters.new(request.parameters)
request.format = "mobile"
params[:format]
=> nil
Run Code Online (Sandbox Code Playgroud)

这在技术上不是一个错误,因为它很容易让客户端代码查找request.format而不是params[:format]作为此信息的真实来源(并且不希望能够互换使用).

但这对我来说感觉就像一个设计回归.拥有paramsrequest.parameters相同的"除了例外"现在给我们造成了一个错误,我希望它在未来会给许多开发者造成错误.

我做错了吗?如果是这样,为什么这不是一个问题,我应该做些什么呢?请注意,使我沿着这条路径走下去的用例与format =文档完全一致.

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

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

rails 4带有link_to和带有强参数的方法帖子

我陷入了一个不会那么复杂的问题,但我只是没有把事情做对.

假设我有两个型号:

class Notification < ActiveRecord::Base
  belongs_to :device

  validates :number, presence: true
end
Run Code Online (Sandbox Code Playgroud)

class Device < ActiveRecord::Base
  belongs_to :user
  has_many :notifications, :dependent => :destroy

  //rest omitted for brevity
end
Run Code Online (Sandbox Code Playgroud)

使用嵌套路线如下:

 resources :devices do
   resources :notifications
 end
Run Code Online (Sandbox Code Playgroud)

和这样的通知控制器:

class NotificationsController < ApplicationController
  before_filter :authenticate_user!
  before_action :set_device, :only => [:index, :new, :create]
  before_filter :load_notification, only: :create

  load_and_authorize_resource :device
  load_and_authorize_resource :notification, :through => :device


  def index
  end

  def new
    @notification = @device.notifications.build
  end

  def create
    params.each do |param|
      logger.debug param
    end
    @notification …
Run Code Online (Sandbox Code Playgroud)

http-post link-to strong-parameters ruby-on-rails-4

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

rails 4强参数:让他们有条件?

有没有办法使strong_params有条件? 无需编写2个单独的方法?如果某个条件为真,则希望在许可列表中添加某些属性

例如:

devise_parameter_sanitizer.for(:user) {|u| u.permit(:user,
                                                    :email,
                                                    :role,
                                                    )}
Run Code Online (Sandbox Code Playgroud)

我有这个:上面例子中允许的角色属性.我只希望在Rails.env.development有这种方法的时候允许这个属性吗?

conditional strong-parameters ruby-on-rails-4

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

undefined方法`permit'表示"立即提交!":字符串.我哪里错了?

我一直在努力尝试permit使用其他一些StackOverflow帖子来解决这个错误,但似乎无法超越它.我有一个项目模型和控制器以及版本模型和控制器. Projects/##/versions/new是一个表单页面,用于创建项目ID ##的新版本.但是当我单击提交按钮来创建版本时......它会在以下错误中引发以下错误VersionsController:

undefined method `permit' for "Submit Now! ":String

Extracted source (around line #36):
34
35
36
37
38


    def version_params
      params.require(:version).permit(:title)
    end
end
Run Code Online (Sandbox Code Playgroud)

任何和所有的帮助将不胜感激...我一直在努力解决这个问题太久了.我的守则如下:

的routes.rb

resources :users
  resources :sessions, only: [:new, :create, :destroy]
  resources :projects, only: [:create, :new, :show, :edit, :update, :destroy]

  resources :projects do
    resources :versions
  end

  # get "static_pages/home"
  # get "static_pages/help"
  # get "static_pages/about"
  #The original routes above map to...
  root  'static_pages#home'
  match '/signup',  to: 'users#new',            via: 'get'
  match '/signin', …
Run Code Online (Sandbox Code Playgroud)

error-handling strong-parameters ruby-on-rails-4

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

如何使用 strong_params 要求嵌套参数

我正在制作一个 Rails 应用程序,我想要一个控制器来优雅地处理格式不正确的请求。因此,理想情况下,参数哈希如下所示:

{"user" => { "username"=>"user1212" } }
Run Code Online (Sandbox Code Playgroud)

但是如果有人发送看起来像这样的数据:

{"user" => "user1212" }
Run Code Online (Sandbox Code Playgroud)

我希望能够引发描述性错误,最好是 ParameterMissing。现在,我的 user_params 方法如下所示:

def user_params
   params.require(:user).require(:username)
end
Run Code Online (Sandbox Code Playgroud)

但是如果params.require(:user)返回一个字符串,如第二个例子,我得到一个 NoMethodError。我试过了,params[:owner].require(:username)但这给出了一个 TypeError。我已经尝试了一堆许可和要求的组合,但我还没有找到我喜欢的解决方案。有没有一种很好的、​​干净的方法来要求 params[:user] 是一个散列?

error-handling controller ruby-on-rails strong-parameters

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

使用强参数Rails创建和更新嵌套模型

这是我的3个型号.

User
    has_many :memberships
    has_many :teams, through: :memberships, dependent: :destroy
    accepts_nested_attributes_for :memberships

Team
    has_many :memberships
    has_many :users, through: :memberships, dependent: :destroy
    accepts_nested_attributes_for :memberships

Membership
    belongs_to :team
    belongs_to :user
Run Code Online (Sandbox Code Playgroud)

以下是我的Team控制器的一些部分.我的目标是向某个团队添加/更新成员.请注意,添加成员的源已作为一组用户存在.

TeamsController
    def create
        @team = Team.new(team_params)
        @team.users << User.find(member_ids) #add leader and members to team
        if @team.save 
            #redirect to created team
        else
            #show errors
        end
    end

    def update
        #TO DO: update team roster here
        if @team.update(team_params)
            #redirect to updated team
        else
            #show errors
        end
    end
Run Code Online (Sandbox Code Playgroud)

Team控制器的强参数

#parameters for team details
def …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails has-many-through nested-attributes strong-parameters

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

如何为不允许的参数引发错误,但允许特定的参数?

我添加了以下内容,application.rb因为我想控制所有发送的参数:

config.action_controller.action_on_unpermitted_parameters = :raise
Run Code Online (Sandbox Code Playgroud)

这样,如果我忘记允许参数或类似的东西,我在开发过程中会很快看到。

但是 - 现在尝试通过表单更新用户时出现以下错误:

found unpermitted parameters: utf8, _method, authenticity_token, commit, locale, id
Run Code Online (Sandbox Code Playgroud)

我有点不确定如何继续:确实这些是我以前不关心的参数form_for,据我所知,它们是由 Rails' 自动发送的。

我只是想关心我的资源,例如参数user[name]user[email]等等。

有没有办法通常允许上面那些不允许的参数?还是我错过了一个重要的点?

更新

由于问题似乎无法重现,这里是具有特定提交的存储库:

https://github.com/jmuheim/base/commit/dbb62dd68a8a243d056457c9093a6cd8ea3e3836

只需启动服务器,加载页面,注册为用户(或使用来自种子的joshpw joshjosh),然后转到用户 > 列出用户,并编辑您的用户。然后你会得到错误。

您也可以只做$ rake并查看失败的规格。

有趣的是,注册时没有出现错误,所以我猜它与UsersController. 也许是继承资源的问题?

ruby-on-rails strong-parameters

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

RoR 允许非模型参数

我很难理解如何允许非模型参数。

我读了:

因此,对于“正常”情况 - 假设我有一个Foo只有一个属性的模型bar

# foo.rb
class Foo < ActiveRecord::Base
  # bar, which is a integer
end

# views/foos/new.html.erb
<%= form_for @foo do |f| %>
    <%= f.number_field :bar %>
    <%= f.submit %>
<% end %>

#foos_controller.rb
def create
    @foo = Foo.new(foo_params)
    # ...
end

#...

private

def foo_params
    params.require(:foo).permit(:bar)
end
Run Code Online (Sandbox Code Playgroud)

因此,当我提交表格时,Foo就会创建遗嘱。


但是,如果bar属性背后有一些组合了一些非模型参数的逻辑怎么办?假设这bar是两个参数 ( ) 的总和bar = bar_1 + bar_2。然后视图和控制器看起来像:

# views/foos/new.html.erb …
Run Code Online (Sandbox Code Playgroud)

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

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

Rails:.require() 却没有真正需要它?

我正在尝试使用...

params.require(:subscriber).permit(:utm_source, :utm_medium, :utm_campaign, :utm_term, :utm_content)
Run Code Online (Sandbox Code Playgroud)

问题是在极少数情况下我想做:

Subscriber.new(subscriber_params)

我不在乎所有的值是否都是空的......当我这样做时它会引发ActionController::ParameterMissing

所以我需要的是一种使require()“可选”成为“可选”的方法,但仍然使用它来限制嵌套参数和安全性,这样人们就无法添加{admin: true}诸如此类的东西......

实际的 params 哈希看起来像:

{subscriber: {utm_source: 1, ...}

我无法更改该部分,因为它已在应用程序的许多其他地方使用。就这一点而已。

parameters ruby-on-rails actioncontroller strong-parameters ruby-on-rails-5

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