Rails 4个强参数,例如变量

时间:2014-10-25 10:42:05

标签: ruby ruby-on-rails-4 rails-activerecord strong-parameters

我使用Rails 4.1.6和Ruby 2.1.3

bookmarks_controller.rb

class BookmarksController < ApplicationController
    def index
        @bookmarks = ListBookmarks.list
        render json: @bookmarks.to_json     
    end

    def create
        @bookmark = CreateBookmark.new(params[:bookmark]).create

        if @bookmark
            head 201
        else
            head 422
        end
    end
end

bookmarks_controller_test.rb

require 'test_helper'

class BookmarksControllerTest < ActionController::TestCase
  test "return ok status if bookmark is created" do
    post :create, bookmark: { title: "Tuts+", url: "http://tutsplus.com" }

    assert_response 201
  end

  test "returns not ok status if bookmark is not created" do
    post :create, bookmark: {}

    assert_response 422
  end
end

create_bookmark.rb

class CreateBookmark
    def initialize data
        @data = data
    end

    def create
        bookmark = Bookmark.new @data
        bookmark.save
    end
end

但是当我运行我的测试时它返回:

ActiveModel::ForbiddenAttributesError:

我已将 bookmarks_controller.rb 更改为:

class BookmarksController < ApplicationController
    def index
        @bookmarks = ListBookmarks.list
        render json: @bookmarks.to_json     
    end

    def create
        @bookmark = CreateBookmark.new(bookmark_params).create

        if @bookmark
            head 201
        else
            head 422
        end
    end

    private 

    def bookmark_params
        params.require(:bookmark).permit(:title, :url)
    end
end

它返回以下错误:

ActionController::ParameterMissing: param is missing or the value is empty: bookmark

2 个答案:

答案 0 :(得分:2)

我看到你更新了你的初始帖子。我猜你的第二个测试用例现在失败了ActionController::ParameterMissing

首先,我们需要澄清代码中会发生什么。

您正在发送请求: post :create, bookmark: {},所以params[:bookmark]肯定是空的。如果params.require(:bookmark)为空或缺失,则ActionController::ParameterMissing语句会引发params[:bookmark]

现在让我们根据您的需求思考您可以做些什么。

如果您希望bookmark_params在发送params[:bookmark]的情况下以静默方式返回空哈希,则可以执行以下操作:params.fetch(:bookmark, {}).permit(:title, :url)

在实际应用程序中,它的常用模式是在ApplicationController中使用params.require并使用rescue_from helper来解救ActionController::ParameterMissing。也许它还没有出现在你的教程中。

如果您想测试您的操作没有创建包含无效输入的书签,您可以尝试使用无效数据发送请求,例如post :create, bookmark: {asdasdasd: nil}

答案 1 :(得分:0)

我将 bookmark_params 方法更改为此方法,并且有效:

def bookmark_params
   params[:bookmark].permit!
end