我使用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
答案 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