Rails 4 has_one association forme et non de la construction
J'ai besoin de quelques conseils sur la façon de Rails 4 fonctionne avec has_one et belongs_to association.
Mon formulaire ne suffit pas à sauver le has_one
relation
Modèle Post
class Post < ActiveRecord::Base
validates: :body, presence: true
has_one :category, dependent: :destroy
accepts_nested_attributes_for :category
end
class Category < ActiveRecord::Base
validates :title, presence: true
belongs_to :post
end
Contrôleur Post
class PostController < ApplicationController
def new
@post = Post.new
@post.build_category
end
def create
@post = Post.new(post_params)
end
private
def post_params
params.require(:post).permit(:body)
end
end
Forme dans le Post#nouvelle action
<%= form_for @post do |form| %>
<%= form.label :body %>
<%= form.text_area :body %>
<%= fields_for :category do |category_fields| %>
<%= category_fields.label :title %>
<%= category_fields.text_field :title %>
<% end %>
<%= form.button "Add Post" %>
<% end %>
Ce n'est pas de sauver la category
titre lors de la Poste le formulaire est soumis.
Debug params
utf8: ✓
authenticity_token: 08/I6MsYjNUhzg4W+9SWuvXbSdN7WX2x6l2TmNwRl40=
post: !ruby/hash:ActionController::Parameters
body: 'The best ice cream sandwich ever'
category: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
title: 'Cold Treats'
button: ''
action: create
controller: posts
App journal
Processing by BusinessesController#create as HTML
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"08/I6MsYjNUhzg4W+9SWuvXbSdN7WX2x6l2TmNwRl40=",
"post"=>{"body"=>"The best ice cream sandwich ever"},
"category"=>{"title"=>"Cold Treats", "button"=>""}
Dans la console Rails.. je ne peut exécuter les opérations suivantes avec succès
> a = Post.new
=> #<Post id: nil, body: "">
> a.category
=> nil
> b = Post.new
=> #<Post id: nil, body: "">
> b.build_category
=> #<Post id: nil, title: nil>
> b.body = "The best ice cream sandwich ever"
=> "The best ice cream sandwich ever"
> b.category.title = "Cold Treats"
=> "Cold Treats"
Les questions que j'ai le concerne, de comment résoudre ce problème:
- Je ne suis pas sûr si je dois ajouter
:category_attributes
dans lepost_params
forte paramètre de la méthode? - Devrait les journaux de débogage params montrent que la
Category
attributs
sont imbriquées à l'intérieur desPost
paramètre? - Dans le
Category
paramètre de hachage il y a un videbutton
touche qui n'est pas dans monfields_for
suis-je raté quelque chose lors de l'utilisation de la forme aides? - Est la raison, l'action de création ne prend pas l'
build_category
méthode et j'ai besoin d'ajouter cela à la créer
d'action? - Sera validations sur la
Category
modèle (presence: true
) être
automatiquement utilisé sur laPost
forme?
Merci d'avance.
Mise à jour: manquant category_fields
à l'intérieur de fields_for
bloc.
OriginalL'auteur Wasabi Developer | 2013-11-06
Vous devez vous connecter pour publier un commentaire.
Question #1: Oui, vous devez ajouter le
:category_attributes
dans lepost_params
forte paramètre de la méthode comme ceci:Question #2: Oui, les paramètres doivent être imbriqués, c'est une faute de frappe dans votre point de vue parce que vous n'êtes pas l'application de la
fields_for
(au pluriel) dans le champ d'application de la mère générateur de formulaire, que vous n'êtes pas à l'aide de lacategory_fields
générateur de formulaire à l'intérieur de lafields_for
bloc!La vue devrait ressembler à ceci:
La Question n ° 3: Le bouton paramètre peut être au mauvais endroit en raison de la mélangées bâtiment de forme de votre point de vue.
La Question n ° 4: Vous n'avez pas besoin de construire le modèle de l'enfant dans votre action de création, si vous l'acceptez imbriquée attributs
La Question n ° 5: Oui, la validation du modèle de l'enfant est également exécuter et si la validation de l'enfant échoue, les parents ont aussi une erreur et n'est pas enregistré dans la base de données.
OriginalL'auteur sled
@traîneau, vous avez raison. Mais pour l'avenir Rails 4.1 gras (**) sera obsolète
en gras seront forcés de l'être (:corps, category_attributes: [: 'titre'])
OriginalL'auteur G.B