respond_toメソッドの操作に問題があります。モデルが保存されると、正しくjson形式で返されます。しかし、モデルが保存されなかったとき、ActiveRecord :: RecordNotUniqueのようなエラーのために、レールは私のものではないという別の応答を返します: "Completed 500 Internal Server Error"と返された応答はajaxエラーfuctionに行きます。Rails ajax call 500 internal server error
ここで私の質問は、適切なエラーメッセージをユーザーに表示できるように、正しい応答、つまりelseステートメント内の応答を送信する方法です。
私は開発モードです。
簡単にするためにコードを少し変更しました。
ありがとうございました。
コントローラー:
def create
@distribuicao = DistribuicaoPorCargo.new(distribuicao_por_cargo_params)
respond_to do |format|
if @distribuicao.save
format.json { render json: @distribuicao.distribuicao, status: :created }
else
format.json { render json: @distribuicao.errors.full_messages, status: :unprocessable_entity }
end
end
end
の.js:
$.ajax
url: '/distribuicao_por_cargos'
type: 'POST'
dataType: 'JSON'
data: {
data: JSON.stringify(data_send_to_server)
}
success: (data, textStatus, jqXHR) ->
console.log("AJAX Sucesss: #{textStatus}")
error: (jqXHR, textStatus, errorThrown) ->
console.log("AJAX Failed: #{textStatus}")
ログ:
Started POST "/distribuicao_por_cargos" for 187.110.216.111 at 017-06-02 17:32:22 -0300
Cannot render console from 187.110.216.111! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by DistribuicaoPorCargosController#create as JSON
Parameters: {"concurso_id"=>"2", "local_da_prova_id"=>"6", "tabela"=>"{\"cargo_id\":\"4\",\"quantidade_de_candidatos\":\"10\"},{\"cargo_id\":\"9\",\"quantidade_de_candidatos\":\"10\"},{\"cargo_id\":\"12}]"}
Concurso Load (0.4ms) SELECT "concursos".* FROM "concursos" WHERE "concursos"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]]
LocalDaProva Load (0.2ms) SELECT "local_da_provas".* FROM "local_da_provas" WHERE "local_da_provas"."id" = $1 LIMIT $2 [["id", 6], ["LIMIT", 1]]
(0.1ms)
BEGIN
LocalDaProva Load (0.3ms) SELECT "local_da_provas".* FROM "local_da_provas" WHERE "local_da_provas"."id" = $1 LIMIT $2 [["id", 6], ["LIMIT", 1]] SQL (1.5ms)
INSERT INTO "distribuicao_por_cargos" ("created_at", "updated_at", "local_da_prova_id", "distribuicao") VALUES ($1, $2, $3, $4) RETURNING "id" [["created_at", 2017-06-02 20:32:23 UTC], ["updated_at", 2017-06-02 20:32:23 UTC], ["local_da_prova_id", 6], ["distribuicao", "[{\"cargo_id\":\"4\",\"quantidade_de_candidatos\":\"10\"},{\"cargo_id}]"]]
(0.2ms)
ROLLBACK
Completed 500 Internal Server Error in 108ms (ActiveRecord: 6.3ms)
ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_distribuicao_por_cargos_on_local_da_prova_id"
DETAIL: Key (local_da_prova_id)=(6) already exists.
: INSERT INTO "distribuicao_por_cargos" ("created_at", "updated_at", "local_da_prova_id", "distribuicao") VALUES ($1, $2, $3, $4) RETURNING "id"):
ニース!私はこのエラー(ActiveRecord :: RecordNotUnique)がデータベースレベルであることを認識しなかったので、アプリケーションがそれをキャッチしなかったのはこのためです。 –
@PedroGabrielLimaはい、モデルの検証では、dbに挿入する前にエラーをキャッチし、コントローラが正しい応答を送信します。だから問題を解決するはずです(もしそうであれば、ダンプをクリックして答えを受け入れることを忘れてください)。 – Gerry