2 Stimmen

Das Parsen von Blog-Beitrag-Tags aus einem Textfeld

Zunächst einmal möchte ich sagen, dass ich weiß, dass diese genaue Frage hier bereits gestellt wurde. Aber sie wurde nicht beantwortet und ich möchte keinen alten Thread von vor einem Jahr wiederbeleben.

Zweitens bin ich nicht daran interessiert, Plugins zu verwenden, ja, ich möchte das Rad neu erfinden. Ich schreibe diesen Blog, um Ruby on Rails zu lernen.

Ich versuche, das Verhalten des Anhängens von Tags an einen Beitrag in meiner Rails-App nachzubilden.

Das Formular für die Beiträge sieht folgendermaßen aus:

<%= form_for @post do |post_form| %>
  ...
  <%= render :partial => 'tags/form',
         :locals => { :form => post_form } %>
  ...
<% end %>

Und das Tags-Formular wie folgt:

<%= form.fields_for :tags do |tag_form| %>

    <%= tag_form.label :tags, 'Tags' %> (durch Kommas getrennt)
    <%= tag_form.text_field :tags %>

<% end %>

Das Problem, auf das ich stoße, ist, dass "tags" kein Feld in meiner Post-Klasse ist. Meine Post- und Tag-Modelle haben HABTM-Beziehungen mit PostsTagsJoinTable dazwischen. Daher muss ich irgendwie das Tags-Textfeld analysieren (mit string.split(',')) und die resultierenden Tag-Strings an meinen Controller übergeben, damit mein Controller die Tags zusammen mit dem neuen Blog-Beitrag erstellen und verknüpfen kann.

Sind meine Ansichten richtig eingerichtet? Wie sollten meine Controller aussehen? Insbesondere die Post.create Methode.

Danke!

2voto

farnoy Punkte 6868

Ich verstehe, dass du nicht an Plugins interessiert bist, aber sie behandeln es so: Class Post hat die Methode tag_list=, die split(',') aus dem String macht und dann nach Tags aus der HABTM-Beziehung sucht und hinzufügt. Du kannst Post#tag_list= so definieren:

def tag_list=(tags)
  self.tags.clear  # löscht alle Beziehungen
  tags.split(',').each do |tag|
    self.tags << Tag.find_by_title(tag)  # und weist erneut zu
  end
end

Um die Liste der Tags bereitzustellen, z.B. damit ein Formularfeld vorhandene Tags hat, mache folgendes:

def tag_list
  self.tags.collect do |tag|
    tag.name
  end.join(',')

Jetzt kannst du <%= text_field_tag :post, :tag_list, :value => @post.tag_list %> verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X