Qu'est-ce qui provoque une erreur D'Entité non traitable 422 dans Rails 3?
C'est le message d'erreur du fichier journal:
Started POST "/stages" for 127.0.0.1 at 2011-04-02 23:22:18 -0500
Processing by StagesController#create as JS
Parameters: {"utf8"=>"✓", "authenticity_token"=>"ob37MMciudHqAnNXFoeofWyVfLnrTxlHfncyDsZLpsI=", "stage"=>{"project_id"=>"3", "name"=>"First"}}
User Load (1.1ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 1) LIMIT 1
#<User id: 1, email: "test@abc.com", encrypted_password: "$2a$10$qUbNGm6lZ366jRiE0vK0gOpxbGXD5JmfqWmH1lfLlCEC...", password_salt: "$2a$10$qUbNGm6lZ366jRiE0vK0gO", reset_password_token: nil, remember_token: nil, remember_created_at: nil, sign_in_count: 264, current_sign_in_at: "2011-04-03 04:12:24", last_sign_in_at: "2011-04-03 03:21:37", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", username: "test", f_name: "Test", l_name: "User", created_at: "2011-01-22 07:17:45", updated_at: "2011-04-03 04:12:24", invitation_token: nil, invitation_sent_at: nil, plan_id: 3, current_state: nil, confirmation_token: nil, confirmed_at: "2011-02-11 23:19:15", confirmation_sent_at: "2011-02-11 23:18:20">
Role Load (0.4ms) SELECT "roles".* FROM "roles" INNER JOIN "assignments" ON "roles".id = "assignments".role_id WHERE (("assignments".user_id = 1))
Completed 422 Unprocessable Entity in 302ms (Views: 0.2ms | ActiveRecord: 1.5ms)
Des idées ?
Il s'agit des actions new & create dans stage:
def new
@project = Project.new
respond_with(@project)
end
def create
#@project = current_user.projects.create(params[:project])
@project = current_user.projects.build(params[:project])
#@project.current_user = current_user
if @project.save
respond_with(@project, :status => :created, :location => @project) do |format|
flash.now[:notice] = 'Project was successfully created.'
format.html { redirect_to(@project) }
format.js { render :partial => "projects/show", :locals => {:project => @project}, :layout => false, :status => :created }
end
else
respond_with(@project.errors, :status => :unprocessable_entity) do |format|
format.js { render :json => @project.errors, :layout => false, :status => :unprocessable_entity }
format.html { render :action => "new" }
end
end
end
C'est la forme partielle qui crée la nouvelle étape:
<% stage ||= Stage.new
new_stage = stage.new_record? %>
<%= form_for(stage, :html => { :class=>"ajax-form", :id => "stage-ajax-form"}, :remote => true, :disable_with => (new_stage ? "Adding..." : "Saving...")) do |f| %>
<%= f.hidden_field :project_id %>
<%#= f.hidden_field :client_id, :value => @project.client.id %>
<div class="validation-error" style="display:none"></div>
<label for="stage_name"><span class="icon stage-icon"> </span></label>
<input type="text" class="name" size="20" name="stage[name]" id="stage_name" value="<%= stage.name %>" >
<%= f.submit(new_stage ? "Add Stage" : "Save", :class => "green awesome") %>
<% end %>
2 réponses
S'avère que c'est cette ligne qui a causé cette erreur:
@project = current_user.projects.build(params[:project])
, j'ai remplacé les build
avec create
et tout fonctionne maintenant.
La réponse ici est que toute erreur dans votre cas entraînera '422 Unprocessable Entity' lorsque vous répondez au format JSON. La raison en est cette ligne dans votre contrôleur:
format.js { render :json => @project.errors, :layout => false, :status => :unprocessable_entity }
C'est-à-dire lorsque l'objet a des erreurs et que vous répondez au format JSON, vous enverrez toujours le statut 422.
Ce dont vous avez réellement besoin est de faire une enquête plus approfondie pourquoi votre objet aurait des erreurs. Et qui pourrait être n'importe quoi. Par exemple: lorsqu'il ne persiste pas le projet@, il peut avoir a provoqué une erreur de validation, etc..
Dans ce cas, votre question n'est pas pertinente et la réponse acceptée est trompeuse.
IMHO, vous devriez soit changer la question, ou mettre à jour la réponse.