2010-10-14 6 views
0

J'écris une application qui contient une base de données avec plusieurs tables et tables jointes et ainsi de suite ... les deux je travaille avec actuellement (et suis perplexe sur) sont ma table de pages et mes modèles table.Rails 3 has_one/has_many question

Maintenant, une page ne peut contenir qu'un seul modèle, mais un modèle peut contenir plusieurs pages.

Modèle pour la page:

class Page < ActiveRecord::Base 
    has_one :template 
    accepts_nested_attributes_for :template 
end 

Modèle pour modèle:

class Template < ActiveRecord::Base 
    has_many :pages 
end 

Lorsqu'un utilisateur crée une page, je veux qu'ils soient en mesure de choisir une mise en page, mais pour une raison quelconque la sélection la liste n'apparaît pas

HTML pour le spectacle:

<%= form_for(@page) do |page| %> 
    <% if @page.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@page.errors.count, "error") %> prohibited this page from being saved:</h2> 

     <ul> 
     <% @page.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= page.label "Page title" %><br /> 
    <%= page.text_field :slug %> 
    </div> 
    <div class="field"> 
    <%= page.label :active %>?<br /> 
    <%= page.check_box :active %> 
    </div> 

    <%= page.fields_for :category do |cat| %> 
     <%= cat.label :category %> 
     <%= select :page, :category_id, Category.find(:all).collect{|c| [c.name, c.id] } %> 
    <% end %> 

    <%= page.fields_for :template do |temp| %> 
     <%= temp.label :template %> 
     <%= select :page, :template_id, Template.find(:all).collect{|t| [t.content, t.id] } %> 
    <% end %> 

    <div class="actions"> 
    <%= submit_tag %> 
    </div> 
<% end %> 

Des raisons pour lesquelles la dernière sélection ne s'afficherait pas?

Merci d'avance pour toute l'aide!

Edit:

Tout ce que je devais faire pour résoudre le problème a été mis la logique du modèle dans mon contrôleur, puis appeler cet objet dans la vue et cela a fonctionné

Controller:

def new 
    @page = Page.new 
    @categories = Category.find(:all) 
    @templates = Template.find(:all) 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @page } 
    end 
    end 

Afficher:

<div class="field"> 
     <%= page.label :template %> 
     <%= page.select("template_id", @templates.collect { |t| [t.content, t.id] }, :include_blank => 'None') %> 
    </div> 

Espérons que cela aide quelqu'un d'autre!

Répondre

1

Première page pourrait "appartient à" modèle:

class Page < ActiveRecord::Base 
    belongs_to :template 
    accepts_nested_attributes_for :template 
end 

Et au lieu de:

<%= page.fields_for :template do |temp| %> 
    <%= temp.label :template %> 
    <%= select :page, :template_id, Template.find(:all).collect{|t| [t.content, t.id] } %> 
<% end %> 

j'utiliser un simple collection_select:

<%= page.select("template_id", Template.all.collect {|t| [ t.contet, t.id ] }) %> 
+0

Je reçois cette erreur maintenant : méthode non définie 'all 'pour ActionView :: Template: Class – dennismonsewicz

+0

J'ai trouvé mon problème! Je vais mettre dans la solution ci-dessus – dennismonsewicz