Rails 3 has_one / has_many вопрос - PullRequest
0 голосов
/ 14 октября 2010

Я пишу приложение, которое содержит базу данных с несколькими таблицами и объединяющими таблицами и т. Д. ... два, с которыми я работаю в настоящее время (и нахожусь в тупике), это моя таблица страниц и моя таблица шаблонов.

Теперь страница может содержать только один шаблон, но шаблон может иметь много страниц.

Модель для страницы:

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

Модель для шаблона:

class Template < ActiveRecord::Base
  has_many :pages
end

Когда пользователь создает страницу, я хочу, чтобы он мог выбирать макет, но по какой-то причине список выбора не отображается

HTML для показа:

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

Любойпричины, по которым последний выбор не будет отображаться?

Заранее спасибо за помощь!

Редактировать:

Все, что мне нужно было сделать, чтобы исправить проблему, было положеноМодель логики в моем контроллере, а затем вызвать этот объект в представлении, и он работал

Контроллер:

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

Представление:

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

Надеюсь, это поможет кому-то еще!

1 Ответ

1 голос
/ 14 октября 2010

Первая страница может «принадлежать» шаблону:

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

И вместо:

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

Я бы использовал простой набор collection_select:

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