2016-04-01 6 views
0

J'ai un nom partiel _form.html.erb dans mon dossier alerts/views /. Je rends ce partiel de la page show dans mon dossier agences/views /.Ruby on Rails formulaire_pour créer un objet vide

Tout rend correctement, et le partiel crée une nouvelle alerte, mais l'alerte est complètement vide.

alerts_controller créer méthode

def create 
    @alert = Alert.new(body: params[:body], 
        severity: params[:severity], 
        agency_id: @current_member.id) 

    respond_to do |format| 
     if @alert.save 
     format.html { redirect_to @alert.agency, notice: 'Alert was successfully created.' } 
     format.json { render :show, status: :created, location: @alert} 
     else 
     format.html { render :new } 
     format.json { render json: @alert.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

_form.html.erb

<%= form_for(Alert.new) do |f| %> 
    <div class="input-group"> 
    <div class="field"> 
     <%= f.label :body %><br> 
     <%= f.text_field :body %> 
    </div> 
    <div class="field"> 
     <%= f.label :severity %><br> 
     <%= f.number_field :severity %> 
    </div> 
    <div class="action"> 
     <%= f.submit %> 
    </div> 
    </div> 
<% end %> 

Il n'y a pas d'erreur, sauf que l'alerte créée est complètement vide. Les variables body, severity et agency_id sont toutes nulles.

J'ai essayé de remplacer la ligne

<%= form_for(Alert.new) do |f| %> 

avec ceci:

<%= form_for(@alert) do |f| %> 

et en ajoutant cette ligne:

@alert = Alert.new 

la méthode d'exposition dans le contrôleur de l'agence.

Mais la même chose se produit de toute façon. Qu'est-ce que je fais mal?

EDIT

Ceci est le journal à partir quand je frappe soumettre, et se terminant avant le chargement de la redirection dans la méthode alerts.create.

Started POST "/alerts" for ::1 at 2016-03-31 18:29:43 -0400 
Processing by AlertsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"CgpepnYUec9uUoE/Ys6SAkOlzmK+w2q9IN782sXNoXnB3UyuegiS6m+W+mW+nXu4EIL8P8xH6JdigU8FfmzhVw==", "alert"=>{"body"=>"This is the body text", "severity"=>"12345"}, "commit"=>"Create Alert"} 
    Account Load (0.1ms) SELECT "accounts".* FROM "accounts" WHERE "accounts"."id" = ? LIMIT 1 [["id", 7]] 
    Agency Load (0.1ms) SELECT "agencies".* FROM "agencies" WHERE "agencies"."id" = ? LIMIT 1 [["id", 2]] 
    (0.1ms) begin transaction 
    SQL (0.2ms) INSERT INTO "alerts" ("agency_id", "created_at", "updated_at") VALUES (?, ?, ?) [["agency_id", 2], ["created_at", "2016-03-31 22:29:43.014846"], ["updated_at", "2016-03-31 22:29:43.014846"]] 
    (135.8ms) commit transaction 
    Agency Load (0.1ms) SELECT "agencies".* FROM "agencies" WHERE "agencies"."id" = ? LIMIT 1 [["id", 2]] 
Redirected to http://localhost:3000/agencies/2 
Completed 302 Found in 141ms (ActiveRecord: 136.2ms) 

Quand je commenter la méthode alerts.create et ajoutez cette ligne:

render plain: params 

Ceci est la sortie:

{"utf8"=>"✓", 
"authenticity_token"=>"3OfteFX41SV/5NxpTcKbP7AKhLm/ZKah+NXVn84e2xwXMP9wWeQ+AH4gpzORkXKF4y225M3gJIu6imZAdb+bMg==", 
"alert"=>{"body"=>"This is the body text.", "severity"=>"12345"}, 
"commit"=>"Create Alert", "controller"=>"alerts", "action"=>"create"} 
+1

Pourriez-vous partager 'console' log?Essayez celui-ci: '@alert = Alert.new ({corps: params [:] corps, gravité: params [:] gravité, agency_id: @ current_member.id})' – 7urkm3n

+1

aussi u peut essayer commenter tout en méthode de création et ajoutez celui-ci puis déclenchez-le. 'render plain params' regarde les données que vous lui transmettez. – 7urkm3n

+0

Pourriez-vous expliquer votre deuxième commentaire en plus? Bravo –

Répondre

1

La cause racine est évidente à partir de votre débogage params. Le hachage params comporte une clé alert. La valeur alert est un hachage de body et severity. Dans votre contrôleur, vous faites référence à params[:body] et params[:severity]. Ceux-ci devraient être params[:alert][:body] et params[:alert][:severity].

Y avait-il une raison de ne pas utiliser les paramètres forts de Rails? Vous pouvez factoriser à quelque chose comme:

def create 
    @alert = Alert.new(alert_params.merge(agency_id: @current_member.id) 
    … 
end 
… 

private 

    def alert_params 
    params.require(:alert).permit(:body, :severity) 
    end 
+0

Merci beaucoup qui a fonctionné! Mais maintenant je suis confus parce que nous avons un autre formulaire qui est pour Posts, et accède directement aux paramètres [: body], params [: title], etc. Pourquoi mon code transmet-il une alerte avec cette information, au lieu de cette information dans params? –

+0

En outre, quelqu'un a déjà dit que l'utilisation de form_for (Alert.new) n'est pas aussi efficace que l'utilisation de form_for (@alert). Quelle est la différence? Devrais-je me balancer d'une façon? –

+0

@MatthewCliatt Si vous n'êtes pas * en train d'éditer * quelque chose avec cette forme c'est bien, si c'est un peu bizarre. –

1

Dans les create method params supposés être comme ça.

Parce que vos params "alert"=>{"body"=>"This is the body text.", "severity"=>"12345"}

def create 
    @alert = Alert.new(body: params[:alert][:body], 
        severity: params[:alert][:severity], 
        agency_id: @current_member.id) 

    respond_to do |format| 
     if @alert.save 
     format.html { redirect_to @alert.agency, notice: 'Alert was successfully created.' } 
     format.json { render :show, status: :created, location: @alert} 
     else 
     format.html { render :new } 
     format.json { render json: @alert.errors, status: :unprocessable_entity } 
     end 
    end 
    end