我在api模式下使用Rails 5.1.3并使用设计进行身份验证。 我想做以下事情:
1 - 在创建新用户期间,创建一个名称为用户电子邮件的公司(另一个模型),并将该公司设置为用户公司 2 - 编写测试以验证此方案
为了实现第1项,我创建了自己的注册控制器并覆盖了create方法,如下所示:
def create
super
if @user.persisted?
company = Company.new(name: @user.email, users: [@user])
@company.save
end
end
但我无法达到第2项。我会遇到几个不同的问题,这取决于我的工作。所以,我有一些问题:
a)我应该写一个控制器规格吗?看起来像这样并失败,因为得到200而不是201.但即使这样,我不确定设计是否真的创建用户:
describe "Create user" do
it "Must create a company when creating user" do
post :create, :params =>{user: {email: "f@x.com"}}
expect(response).to have_http_status(:created)
end
end
b)我应该写一个请求规范吗?看起来像这样并且失败的原因相同:获得200而不是201。
it "Must create a company when creating user" do
post "/users", :params => {:user => {:email => "x@y.com"}}
expect(response).to have_http_status(201)
end
c)我应该执行一些卷发来了解发生了什么吗?
curl -v -H "Accept: application/json" -H "Content-Type: application/json" -XPOST http://localhost:3000/users -d'{"user":{"email": "f@x.com"}}'
然后我收到了这个错误:
{"status":406,"error":"Not Acceptable","exception":"#\u003cActionController::UnknownFormat: ActionController::UnknownFormat
在我的服务器控制台上得到了这个:
Started POST "/users" for 127.0.0.1 at 2017-09-08 01:46:43 -0300
Processing by MyDevise::RegistrationsController#create as JSON
Parameters: {"user"=>{"email"=>"f@x.com"}, "registration"=>{"user"=>
{"email"=>"fuck@x.com"}}}
(0.6ms) BEGIN
User Exists (1.6ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'fuck@x.com' LIMIT 1
(0.4ms) ROLLBACK
Completed 406 Not Acceptable in 39ms (ActiveRecord: 2.6ms)
ActionController::UnknownFormat (ActionController::UnknownFormat):
app/controllers/my_devise/registrations_controller.rb:4:in `create'
那么,我错过了什么?这是CSRF问题吗?我是否需要配置一些东西以便设计我的卷发工作?应该使用请求规范还是控制器规范?
我找到了一些关于如何在测试期间登录用户的示例,但是没有发现如何测试用户的创建。
请帮帮我。
谢谢
答案 0 :(得分:0)
对于第一部分,我建议你不要污染控制器。相反,请使用before call_back
我假设has_many
和company
users
关联
使用以下代码,您只需实现目标,而无需在控制器中编写单个代码
class User< ApplicationRecord belongs_to:公司
before_create :associate_company
private def associate_company
build_company(email: email)
end
端
类公司< ApplicationRecord has_many:用户 端
现在进行测试,你只需测试你的模型,
您只需使用shoulda_matchers来测试before call_back
注意*这样您就可以为每个用户创建一个新的compnay。这正是你想要的吗?
我希望这有效。