Как я могу реорганизовать этот код рельсов - модель ключ / значение - PullRequest
0 голосов
/ 25 августа 2009

У меня есть следующие модели:

class FieldEntryValue < ActiveRecord::Base
  belongs_to :field_entry
end

и

class FieldEntry < ActiveRecord::Base
  belongs_to :field
  belongs_to :media
  has_many :field_entry_values, :dependent => :destroy
  accepts_nested_attributes_for :field_entry_values, :allow_destroy => true
end

FieldEntriesController имеет следующие методы:

  def new
    @field_entry = FieldEntry.new
    session[:media_id] = params[:media_id]
    session[:field_id] = params[:field_id]
    @field_entry.field = Field.find(params[:field_id])
    generate_fields(true)
    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @field_entry }
    end
  end

  def create
    @field_entry = FieldEntry.new(params[:field_entry])
    @field_entry.media_id = session[:media_id]
    @field_entry.field_id = session[:field_id]
    generate_fields(false)
    respond_to do |format|
      if @field_entry.save
        flash[:notice] = 'FieldEntry was successfully created.'
        format.html { redirect_to(@field_entry) }
        format.xml  { render :xml => @field_entry, :status => :created, :locati$
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @field_entry.errors, :status => :unprocess$
      end
    end
  end

  def generate_fields(do_build)
    @ftype = @field_entry.field.field_type.name
    if @ftype == 'string'
      @field_entry.field_entry_values.build if do_build
      @field_entry.field_entry_values[0].key='name'
    elsif @ftype == 'url'
      2.times{ @field_entry.field_entry_values.build } if do_build
      @field_entry.field_entry_values[0].key='name'
      @field_entry.field_entry_values[1].key='url'
    elsif @ftype == 'imdb'
      1.times{ @field_entry.field_entry_values.build } if do_build
      @field_entry.field_entry_values[0].key='value'
    end
  end

И у меня есть партиал, который загружается новым и редактировать:

<% form_for(@field_entry) do |f| %>
  <%= f.error_messages %>

  <% f.fields_for :field_entry_values do |fv_f| %>
    <p>
    <%= fv_f.label :key %><br />
    <%= fv_f.text_field :value %>
    </p>
  <% end %>

  <p>
    <%= f.submit 'Save' %>
  </p>
<% end %>

В представлении должны отображаться переменные числа полей в зависимости от типа и с заданным ключом атрибута в качестве метки и значения для данных.

Для типа строки в качестве примера мне понадобится метка «Имя» (это должен быть ключ) и значение

Это работает в основном за исключением того, что "fv_f.label :key" показывает строковый ключ, а не значение ключевого поля.

  1. Как я могу показать значение @field_entry.field_entry_values.key как метку на виде?

  2. Как я могу сделать контроллер лучше / короче. Например, действительно ли мне нужно установить @field_entry.field_entry_values[0].key='name' в new и метод create, чтобы отобразить его в представлении и сохранить в базе данных?

Спасибо за предложения;) Я новичок в Rails, надеюсь, я сделал это не слишком неправильно;)

Ответы [ 2 ]

0 голосов
/ 08 сентября 2009

Я нашел лучшее решение для моей Задачи 1, в rails 2.3 есть объектный атрибут для цели цикла fields_for, чтобы получить объект поля:

<% form_for(@field_entry) do |f| %>
  <%= f.error_messages %>
    <% f.fields_for :field_entry_values do |fv_f| %>
    <p>
      <%= fv_f.label :value, fv_f.object.key%>
      <br />
      <%= fv_f.text_field :value %>
      <%= fv_f.hidden_field :key %>
    </p>
  <% end %>
  <p>
    <%= submit_tag %>
  </p>
<% end %>

Точка 2 не может быть значительно улучшена, возможно, метод generate_fields мог бы быть загружен как фильтр. Но кроме этого, я пока ничего не вижу, по крайней мере, с такой структурой базы данных.

Но спасибо за помощь: so1o, по крайней мере, вещь с hidden_field была полезной.

0 голосов
/ 25 августа 2009

попробуйте это за 1.

<% form_for(@field_entry) do |f| %>
  <%= f.error_messages %>

  <% @field_entry.field_entry_values.each do |fv| %>

  <% f.fields_for fv do |fv_f| %>
    <p>
    <%= fv_f.label :value, fv.key %><br />
    <%= fv_f.text_field :value %>

    <%= # this will eliminate the need for generate_fields in create %>
    <%= fv_f.hidden_field :key %> 
    </p>
  <% end %>

  <% end %>
  <p>
    <%= f.submit 'Save' %>
  </p>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...