2009-09-03 8 views
0

MISE À JOUR: Résolu. Merci BusyMark!
EDIT: Ceci est révisé basé sur la réponse ci-dessous de BushyMark. Je pense avoir fait toutes les modifications suggérées correctement, mais je ne peux toujours pas obtenir le post_type_id à enregistrer dans la base de données lorsqu'un utilisateur envoie un message.Problème de collection_select

Mon application a une page de profil. Sur la page de profil, le propriétaire de la page peut taper une mise à jour et appuyer sur "envoyer". Les messages de mise à jour apparaissent sans le rechargement de la page (c'est-à-dire Ajax).

Il ressemble fondamentalement à votre page d'accueil Twitter. MAIS, il y a aussi un message "type" que nos utilisateurs sélectionnent en tapant une mise à jour. Le type de message est une liste pré-remplie. Je l'ai fait un modèle et le charger comme des données de base dans l'application. Donc: il existe un modèle de profil, un modèle de post et un modèle post_type.

profile has_many :posts
post belongs_to :post_type
post_type has_many :posts
Le modèle post a également ceci: attr_accessible :message, :post_type_id

routes.rb ressemble à ceci:
map.resources: utilisateurs, :has_one => :profile, :has_many => :posts
map.resources: post_types

Le contrôleur posts a cette méthode pour créer les messages:

def create 
    @post = current_user.profile.posts.build(:message => params[:message], :post_type_id => params[:post_type_id]) 
    if @post.save 
     redirect_to user_profile_path 
    else 
     flash[:notice] = "Message failed to save." 
     redirect_to user_profile_path 
    end 
end 

La vue "show" pour la page de profil où tout cela se produit ressemble à ceci:

<% form_tag(:controller => "posts", :action => "create") do %> 
    <%= label_tag(:message, "Update your people") %><br /> 
<%= text_area_tag(:message, nil, :size => "27x3") %> 
<div class="updateSubmit"><%= submit_tag("Update") %></div> 
<%= label_tag(:type_id, "Optional: Update type", :class => 'typeLabel') %> 
    <%= collection_select(:post, :post_type_id, PostType.all, :id, :name, {:prompt => true}) %> 
    <% end %> 

    <% @profile.profile.posts.each do |c| %> 
    <%=h c.message %></div> 
    <p><%=h c.post_type %></p> 
    <p>Posted <%=h time_ago_in_words(c.created_at) %> ago</p> 
    <% end %> 

C'est l'arrière-plan. Voici le problème. Avec ma configuration actuelle, lorsque l'utilisateur soumet son message, le message est envoyé à la table de base de données des posts, MAIS le post_id ne le fait pas.

Ma balise select est rendu comme ceci:
<select id="post_post_type_id" name="post[post_type_id]"><option value="">Please select</option>

C'est la sortie que je reçois dans le journal lorsque je soumets un message:
traitement PostsController # créer (pour IP à 2009-09-03 03 : 03: 08) [POST]

Parameters: {"message"=>"This is another test.", "commit"=>"Update", "action"=>"create", "authenticity_token"=>"redacted", "post"=>{"post_type_id"=>"3"}, "controller"=>"posts", "user_id"=>"1"}

User Load (0.3ms) SELECT * FROM "users" WHERE ("users"."id" = 1)

Profile Load (0.7ms) SELECT * FROM "profiles" WHERE ("profiles".user_id = 1) LIMIT 1

Post Create (0.5ms) INSERT INTO "posts" ("message", "updated_at", "post_type_id", "profile_id", "created_at") VALUES('Hello', '2009-09-03 20:40:24', NULL, 1, '2009-09-03 20:40:24')

est ici les parties pertinentes de mon schéma, mis à jour par les commentaires de BushyMark:

`create_table "post_types", :force => true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end` 

    `create_table "posts", :force => true do |t| 
    t.text  "message" 
    t.integer "profile_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.integer "post_type_id" 
    end` 

Répondre

1

choses Couple en cours ici, je vois jusqu'à présent:

Type

est un mot réservé Des rails. Il est utilisé pour l'héritage de table unique. Si vous changez le nom de votre colonne pour quelque chose comme "post_type", cela devrait aider énormément à essayer de résoudre des problèmes aléatoires. J'y suis allé il y a un certain temps et je me battais la cervelle avant de connaître STI.

De plus, vous avez un type_id dans votre message. . . mais je n'ai pas vu que votre poste :belongs_to :type. . . n'oubliez pas qu'un modèle avec la clé étrangère a besoin de cette déclaration pour utiliser toutes les associations ActiveRecord.

Espérons que cela aide! Autre modification: J'ai remarqué que dans votre instruction d'insertion, il apparaît que vous avez une colonne "type"? Cela entraînera également des problèmes lors de l'utilisation de relations. Utilisez-vous un modèle 'type' séparé? Pouvez-vous éventuellement poster votre schéma si l'une des déclarations ci-dessus n'aide pas?

Dans ActiveRecord, une colonne de type est réservée et ne s'affiche pas correctement (retour à ma déclaration sur l'héritage de table unique). À ce stade, je recommande fortement de se débarrasser de vos colonnes type et type_id, et de donner à votre poste une colonne "post_type_id".

Ensuite, une fois que vous créez un modèle séparé post_type que has_many :posts vous voulez vous assurer que votre Post :belongs_to :post_type (parce qu'il a la clé étrangère). Une fois que vous faites cela, vous serez en mesure d'appeler post_object.post_type et il renverra la relation modèle que vous recherchez.

+0

J'ai fait tous ces changements, mais je ne peux toujours pas obtenir le post_type_id à enregistrer dans la base de données lorsque l'utilisateur soumet. Je vais réviser ma question avec la nouvelle configuration. – MikeH

+0

Ok, j'ai compris. Ça marche!. Merci. – MikeH