Domanda

UPDATE: risolto. Grazie BusyMark!
EDIT: Questo è rivisto in base alla risposta qui sotto da BushyMark. Credo di aver fatto correttamente tutte le modifiche suggerite, ma non riesco ancora a ottenere il post_type_id per salvare nel database quando un utente invia un messaggio.

La mia applicazione ha una pagina di profilo. Nella pagina del profilo, il proprietario della pagina può digitare un aggiornamento e premere "Invia". I messaggi di aggiornamento appaiono senza la pagina ricarico (vale a dire Ajax).

Si presenta fondamentalmente come tua home page di Twitter. Ma c'è anche un messaggio "tipo" che i nostri utenti di selezionare quando si digita un aggiornamento. Il tipo di messaggio è una lista di pre-popolato. Ho fatto un modello e caricarlo come dati di semi in app.

Quindi: c'è un modello profilo, un modello di posta, e un modello post_type

.

profile has_many :posts
post belongs_to :post_type
post_type has_many :posts
Il modello post ha anche questo: attr_accessible :message, :post_type_id

routes.rb assomiglia a questo:
map.resources: utenti, :has_one => :profile, :has_many => :posts
map.resources: post_types

Il controllore messaggi ha questo metodo per la creazione dei messaggi:

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

Il "show" vista per la pagina del profilo in cui tutto questo accade si presenta così:

<% 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 %>

Questo è lo sfondo. Ecco il problema. Con la mia configurazione attuale, quando l'utente invia il suo messaggio, il messaggio viene inviato alla tabella di database i messaggi, ma il post_id non lo fa.

Il mio tag select sta rendendo in questo modo:
    <select id="post_post_type_id" name="post[post_type_id]"><option value="">Please select</option>

Questa è l'uscita ottengo nel registro quando invio un messaggio:
Processing PostsController # crea (per IP a 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')

Ecco le parti rilevanti del mio schema, aggiornati per i commenti di 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`
È stato utile?

Soluzione

Un paio di cose succedendo qui vedo finora:

tipo è una parola riservata in Rails. E 'utilizzato per la tavola ereditarietà singola. Se si cambia il nome della colonna a qualcosa come "post_type" dovrebbe aiutare immensamente nel cercare di risolvere i problemi casuali. Sono andato attraverso questo un po 'indietro e batteva le cervella prima di sapere su STI.

Inoltre, si dispone di un type_id nel tuo post. . . ma non ho visto che il tuo post :belongs_to :type. . . non dimenticate che un modello con le esigenze chiave esterna questa dichiarazione per utilizzare tutte le associazioni di ActiveRecord.

Spero che questo aiuti!

Un altro Edit: Ho notato che nella sua dichiarazione di inserimento, sembra si dispone di una colonna "tipo"? Questo sarà anche causare problemi quando si utilizzano le relazioni. Si sta utilizzando un modello separato 'tipo'? Si può eventualmente pubblicare il tuo schema se una qualsiasi delle dichiarazioni di cui sopra non aiutano?

In ActiveRecord, una colonna di tipo è riservato e non saranno visualizzati correttamente (di nuovo alla mia dichiarazione circa l'ereditarietà singola tabella). A questo punto vi consiglio vivamente di sbarazzarsi del vostro tipo e colonne type_id, e dando il vostro Pubblica colonna "post_type_id".

Poi una volta che creare un modello separato che post_type has_many :posts si vuole assicurarsi che il proprio Post :belongs_to :post_type (perché ha la chiave esterna). Una volta fatto questo, si sarà in grado di chiamare post_object.post_type e restituirà il rapporto modello che si sta cercando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top