Question

Mise à jour: Résolu. Merci BusyMark!
EDIT: Ceci est révisé en fonction de la réponse ci-dessous de BushyMark. Je pense avoir fait correctement tous les changements proposés, mais je ne peux toujours pas obtenir le post_type_id pour sauver la base de données lorsqu'un utilisateur envoie un message.

Mon application a une page de profil. Sur la page de profil, le propriétaire de la page peut taper une mise à jour et cliquez sur « Soumettre ». Les messages de mise à jour apparaissent sans rechargement de page (à savoir Ajax).

Il ressemble fondamentalement à votre page d'accueil Twitter. Mais, il y a aussi un message « type » qui sélectionnent nos utilisateurs lors de la saisie d'une mise à jour. Le type de message est une liste pré-peuplée. Je l'ai fait un modèle et la charge sous forme de données de semences dans l'application.

: il existe un modèle de profil, un modèle de poste, 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 de postes a ce procédé pour créer des 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

Le « show » vue de 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 de messages, mais le post_id ne fonctionne pas.

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

Ceci 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')

Voici 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`
Était-ce utile?

La solution

couple de choses se passe ici je vois jusqu'à présent:

type est un mot réservé dans Rails. Il est utilisé pour l'héritage de table. Si vous changez votre nom de colonne à quelque chose comme « post_type » il devrait aider énormément à essayer de résoudre les problèmes aléatoires. Je suis passé par ce un certain temps et battais mon cerveau avant que je savais sur les IST.

, vous avez également un type_id dans votre poste. . . mais je ne vois pas que votre :belongs_to :type de poste. . . ne pas oublier qu'un modèle avec les besoins clés étrangers cette déclaration à utiliser toutes les associations ActiveRecord.

Hope this helps!

Une autre Edit: j'ai remarqué que dans votre déclaration d'insertion, il semble que vous avez une colonne « type »? Cela permettra également causer des problèmes lors de l'utilisation des relations. Utilisez-vous un modèle « type » distinct? Pouvez-vous poster éventuellement votre schéma, si l'un des énoncés ci-dessus ne vous aide pas?

Dans ActiveRecord, une colonne de type est réservé et ne marchera pas (retour à ma déclaration sur l'héritage de table simple). A ce stade, je vous recommande vivement de se débarrasser de votre type et colonnes type_id, et donner à votre Publier une colonne « post_type_id ».

Ensuite, une fois que vous créez un modèle distinct qui post_type 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 retournera la relation modèle que vous recherchez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top