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 %>
22
demandé sur marcamillion 2011-04-03 08:29:37

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.

22
répondu marcamillion 2011-04-03 09:39:51

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.

7
répondu Evgenia Manolova 2015-10-09 22:39:11