2016-05-03 10 views
7

Aşağıdaki senaryoyu gerçekleştirmeye çalışıyorum. Temelde ben 2 modeller4 tasarruf alanını, wordpress seçenekleri tablosuna benzer şekilde raylar

Tema

  • başlık

Seçenek

  • theme_id
  • adı
  • değeri
var Ben izin çalışıyorum benim formda

kullanıcı seti seçenekleri ile Seçenekler tablosunu doldurmak, örneğin benim html.erb muhtemelen şu şekilde görünecektir:

<%= form_for [:admin, @options],:class => 'form' do |f| %> 

<div class="form-group"> 
<%= f.label :option[:color] %> 
<%= f.text_field :option[:color], :class => 'form-control' %> 
</div> 

<div class="form-group"> 
<%= f.label :option[:header_title] %> 
<%= f.text_field :option[:header_title], :class => 'form-control' %> 
</div> 

<div class="form-group"> 
<%= f.label :option[:footer_copy] %> 
<%= f.text_field :option[:footer_copy], :class => 'form-control' %> 
</div> 

<div class="form-group"> 
<%= f.submit :value => 'Update', :class => 'btn btn-primary' %> 
</div> 

<% end %> 

yukarıdaki senaryo için 3 satır katacak Seçenekler tablosu, her biri aynı tema_id ile.

Ama denetleyicisi (alın ve eylemleri sonrası) için kullanılacak sözdizimi emin değilim, model ve görünümü

Herhangi bir yardım takdir edilecektir! Teşekkür

Yukarıdaki formu örnek, eg seçenekleri tablosunda 3 ayrı satırlar olarak kaydedecektir kaydedilir DÜZENLEME :

theme_id | isim | değer

1 | "renk" | "yeşil"

1 | "header_title" | "Tema başlığı buraya gider"

1 | "footer_copy" | "lorem ipsum bla bla"

cevap

2

Sen görüşleriniz/temalar/_form içinde

class ThemesController < ApplicationController 
    def new 
    @theme = Theme.new 
    3.times { @theme.options.build } 
    end 

private 
    def theme_params 
    params.require(:theme).permit(:title, options_attributes: [:id, :name, :value, :_destroy]) 
    end 
end 

class Option < ActiveRecord::Base 
    belongs_to :theme 
end 

class Theme < ActiveRecord::Base 
    has_many :options 

    accepts_nested_attributes_for :options, allow_destroy: true 
end 


istemci tarafında dinamik bu alanları oluşturmak gerekir.html.erb/_option_fields.html.erb sizin themes.coffee dosyasında

<fieldset> 
    <%= f.select :name, [["Color", "color"], ["Header", "header_title"], ["Footer", "footer_copy"]] %> 
    <%= f.text_field :value, placeholder: "Value" %> 
    <%= f.hidden_field :_destroy %> 

    <%= link_to "remove", '#', class: "remove_fields" %> 
</fieldset> 

application_helper.rb eklenti içinde

$(document).on "ready page:load", -> 
    $('form').on 'click', '.remove_fields', (event) -> 
    $(this).prev('input[type=hidden]').val('1') 
    $(this).closest('fieldset').hide() 
    event.preventDefault() 

    $('form').on 'click', '.add_fields', (event) -> 
    time = new Date().getTime() 
    regexp = new RegExp($(this).data('id'), 'g') 
    $(this).before($(this).data('fields').replace(regexp, time)) 
    event.preventDefault() 

eklemek

<%= form_for(@theme) do |f| %> 
    <div class="field"> 
    <%= f.label :title %><br> 
    <%= f.text_field :title %> 
    </div> 

    <%= f.fields_for :options do |builder| %> 
    <%= render 'option_fields', f: builder %> 
    <% end %> 

    <%= link_to_add_fields "Add", f, :options %> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

yeni Partials görüntüleme/temalar oluşturmak eklemek

module ApplicationHelper 
    def link_to_add_fields(name, f, association) 
    new_object = f.object.send(association).klass.new 
    id = new_object.object_id 
    fields = f.fields_for(association, new_object, child_index: id) do |builder| 
     render(association.to_s.singularize + "_fields", f: builder) 
    end 
    link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")}) 
    end 
end 

Aşağıdaki gibi, bir temalar kaynağı, denetleyici ve görünümü ile fields_for kullanabilirsiniz

enter image description here

1

Buna benzer bir proje oluşturduğumda, Options CRUD işlevselliğine sahip kendi denetleyiciye sahipti.

video modeli:

theme.rb 

has_many :options 

Opsiyon Modeli

option.rb 
belongs_to :video 

Seçenekler Denetleyici:

def create 
@option = Option.new(option_params) 
@video.theme_id = @theme.id 
if @option.save 
    ... 
end 

Umut bu yararlıdır.

+0

Teşekkürler Drew. Bu, Seçenekler tablosuna tek bir giriş için geçerli gibi görünüyor? 1 formun seçenekler tablosuna – uguMark

+0

çoklu girişler ekleyebileceği bir şey arıyorum Okunduğum şekilde, Renk, Başlık Başlık ve Altbilgi alanları olarak bir Seçenekler modeline sahip olabilirsiniz. Tüm bu öğeleri ayrı tutmaya mı çalışıyorsunuz? –

+0

Evet, bu yüzden seçenekler tablosunun sadece alanları olacaktır: theme_id, name, value. Orijinal sorumu Seçenekler tablosunda nasıl kaydedileceğine dair bir örnek vermek için düzenledim – uguMark

1

sonucu: Gerektiğinde

# routes.rb 
resources :themes 

# app/controllers/themes_controller.rb 
def new 
    @theme = Theme.new 
end 

def create 
@theme = Theme.new theme_params 
@theme.save! 

[:color, :header_title, :footer_copy].each do |option_name| 
    theme.options.create! name: option_name, value: params[:theme][option_name] 
end 
end 

private 
def theme_params 
    params.require(:theme).permit(:title) 
end 

#app/views/themes/new.html.erb 
<%= form_for @theme do |f| %> 
    <div> 
    <%= f.label :title %> 
    <%= f.text_field :title %> 
    </div> 

    <% [:color, :header_title, :footer_copy].each do |option_name| 
    <%= f.fields_for option_name do |option_form| %> 
     <div> 
     <%= option_form.label option_name %> 
     <%= option_form.text_field option_name %> 
     </div> 
    <% end %> 
    <% end %> 
<% end %> 

Sen, yukarıda vb hata denetimi, stillerini ekleyebilir.

1

Kullanım dernekler inşa raylar ve accepts_nested_attributes_for:

class Theme < ActiveRecord::Base 
    has_many :options 
    accepts_nested_attributes_for :options, reject_if: :all_blank, allow_destroy: true 
end 

class Option < ActiveRecord::Base 
    belongs_to :theme 
end 

haml tüm JS kodu, örnekler yazılmasını önlemek için cocoon mücevher kullanın, ancak noktaya gelmeliyiz:

application.js

//= require cocoon 

şekliniz:

= form_for @theme do |f| 
    .field 
    = f.label :title 
    %br 
    = f.text_field :title 
    %h3 Options 
    #option 
    = f.fields_for :options do |option| 
     = render 'options_fields', f: option 
    .links 
     = link_to_add_association 'add option', f, :options 
    = f.submit 

_options_fields:

.nested-fields 
    .field 
    = f.label :name 
    %br 
    = f.text_field :name 
    .field 
    = f.label :value 
    %br 
    = f.text_field :value 
    = link_to_remove_association "remove option", f 

Soru

istediğiniz n basitçe alanlar (seçenekler) ya da bu 3 musunuz? koza n seçenekleri eklemek için daha uygundur.