Как я могу проверить, есть ли у параметров «имя» и «раздел»? например: я хочу проверить «имя», но если его нет, я должен вернуть 400, то же самое с «разделом»
context 'validation' do
let!(:params) do
{ article: {
name: 'a1',
section: 'A'
...
color: 'red'
} }
end
я не знаю, как я могу сравнить
it 'test, not allow empty name' do
expect(name eq '').to have_http_status(400)
end
Хотя вы можете проверить параметры напрямую:
def create
if params[:article][:name].blank? || params[:article][:section].blank?
return head 400
end
# ...
end
Rails выполняет валидацию через модели:
class Article < ApplicationRecord
validates :name, :section, presence: true
end
class ArticlesController < ApplicationController
# POST /articles
def create
@article = Article.new(article_params)
if @article.save
redirect_to @article, status: :created
else
# Yes 422 - not 400
render :new, status: :unprocessable_entity
end
end
private
def article_params
params.require(:article)
.permit(:name, :section, :color)
end
end
require 'rails_helper'
RSpec.describe "Articles API", type: :request do
describe "POST /articles" do
context "with invalid parameters" do
it "returns 422 - Unprocessable entity" do
post '/articles',
params: { article: { name: '' }}
expect(response).to have_http_status :unproccessable_entity
end
end
end
end
Это инкапсулирует данные вместе с проверками, которые воздействуют на данные и ошибки проверки, чтобы вы отображали их обратно пользователю.
Модели (или объекты форм) можно использовать даже тогда, когда данные не сохранены в базе данных.
Вы должны использовать
Article.find(params[:article_id])
, который вызовет исключение ActiveRecord::RecordNotFound и вернет 404 - не найдено. Вероятно, вам следует просто начать с руководства по началу работы или чего-то еще, так как это довольно простой базовый материал для рельсов и не имеет ничего общего с проверками.