访问嵌套表单数据轨道4

时间:2016-12-11 18:45:57

标签: ruby-on-rails ruby-on-rails-4 nested-forms cocoon-gem

我有一个带有嵌套字段的表单,其中包含另一个嵌套字段。所有表单数据都保存到数据库,但我的问题是我无法在视图中显示第二个嵌套字段数据。我有一个必需品模型,有许多目录和目录有许多sub_catalogs。我正在使用rails 4,cocoon和HAML。

Essentials Controller

class EssentialsController < ApplicationController

    before_action :find_essential, only: [:show, :edit, :update, :destroy]


    def index
        @essential = Essential.all.order("created_at DESC")
    end

    def new
        @essential = current_user.essentials.build
    end

    def show
    end

    def create
        @essential = current_user.essentials.build(essential_params)

        if @essential.save
            redirect_to @essential, notice: "Successfully created new essential"
        else
            render 'new'
        end
    end

    def edit
    end

    def update
        if @essential.update(essential_params)
            redirect_to @essential
        else
            render 'edit'
        end
    end

    def destroy
        @essential.destroy
        redirect_to root_path, notice: "Successfully deleted Essential"
    end


    private

    def essential_params
        params.require(:essential).permit(:band_name, :bio, :image, :country, :album, 
            favorites_attributes: [:id, :song_title, :url, :url_type, :_destroy], members_attributes: [:id, :band_member, :position, :_destroy], 
            labels_attributes: [:id, :record_label, :_destroy], catalogs_attributes: [:id, :song_name, :_destroy, sub_catalogs_attributes: [:id, :sub_url, :sub_url_type, :_destroy] ])
    end

    def find_essential
        @essential = Essential.find(params[:id])
    end
end

Essential.rb

class Essential < ActiveRecord::Base

    has_many :favorites, :dependent => :destroy
    has_many :catalogs, :dependent => :destroy
    has_many :labels, :dependent => :destroy
    has_many :members,:dependent => :destroy
    belongs_to :user 

    accepts_nested_attributes_for :favorites, :reject_if => :all_blank, :allow_destroy => true

    accepts_nested_attributes_for :catalogs, :reject_if => :all_blank, :allow_destroy => true

    accepts_nested_attributes_for :labels, :reject_if => :all_blank, :allow_destroy => true
    accepts_nested_attributes_for :members, :reject_if => :all_blank, :allow_destroy => true
    validates :band_name, :bio, :image, presence: true 

    has_attached_file :image, styles: { medium: "400x400#" }
    validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/
end

Catalog.rb

class Catalog < ActiveRecord::Base
    belongs_to :essential
    has_many :sub_catalogs, :dependent => :destroy

    accepts_nested_attributes_for :sub_catalogs, :reject_if => :all_blank, :allow_destroy => true
end

Sub_catalog.rd

class SubCatalog < ActiveRecord::Base
    belongs_to :catalog
end

显示页面

.main_content
    #essential_top.row
        .col-md-4
            = image_tag @essential.image.url(:medium), class: "essential_image"
        .col-md-8
            #essential_info
                %h1= @essential.band_name
                %p.bio= @essential.bio


    .row
        .col-md-6
            #favorites
                %h2 Favorites
                %ul
                    - @essential.favorites.each do |favorite|
                        %li= favorite.song_title

        .col-md-6
            #catalogs
                %h2 Catalogs
                %table
                    - @essential.catalogs.each do |catalog|
                        %tr
                            %td= catalog.song_name
                            %td= link_to catalog.catalog_url_type, "#{catalog.catalog_url}"
                    - @essential.sub_catalogs.each do |sub_catalog|
                        %tr
                            %td= sub_catalog.sub_url


        .col-md-12
            = link_to "Back", root_path, class: "btn btn-secondary"
            - if user_signed_in?
                = link_to "Edit", edit_essential_path, class: "btn btn-secondary"
                = link_to "Delete", essential_path, method: :delete, data: {confirm: "Are you sure?" }, class: "btn btn-secondary"

_form.html.haml

= simple_form_for @essential,  html: { multipart: true } do |f|
    - if @essential.errors.any?
        #errors
            %p
                = @essential.errors.count
                Prevented this essential from saving
            %ul
                - @essential.errors.full_message.each do |msg|
                    %li = msg
    .panel-body
        = f.input :band_name,  placeholder: "Band Name", label: false, input_html: { class: 'form-control form-inline'}
        = f.input :bio, placeholder: "Bio", label: false,  input_html: { class: 'form-control'}
        = f.input :image,  placeholder: "Image", label: false, input_html: { class: 'form-control'}
        = f.input :country, collection: ["England", "United States", "Ireland", "Germany", "France", "Finalnd", "Sweden", "Wales", "Scotland", "Denmark", "Iceland", "Spain", "Italy"], input_html: { class: "form-control form-input" }
        = f.input :album, collection: 1..25, input_html: { class: "form-control" }


        .row
            .col-md-6
                %h3 Favorites
                #favorites
                    = f.simple_fields_for :favorites do |favorite|
                        = render 'favorite_fields', f: favorite
                    .links
                    = link_to_add_association 'Add Favorite', f, :favorites, class: 'btn btn-secondary add-button'

            .col-md-6
                %h3 Catalog
                #catalogs
                    = f.simple_fields_for :catalogs do |catalog|
                        = render 'catalog_fields', f: catalog
                    .links
                    = link_to_add_association 'Add Catalog', f, :catalogs, class: 'btn btn-secondary add-button'
        .row
            .col-md-6
                %h3 Record Label(s)
                #labels
                    = f.simple_fields_for :labels do |label|
                        = render 'label_fields', f: label
                    .links
                    = link_to_add_association 'Add Record Label', f, :labels, class: 'btn btn-secondary add-button'
            .col-md-6
                %h3 Band Members
                #members
                    = f.simple_fields_for :members do |member|
                        = render 'member_fields', f: member
                    .links
                    = link_to_add_association 'Add Band Member', f, :members, class: 'btn btn-secondary add-button'






    = f.button :submit, class: 'btn btn-primary'

_catalog_fields.html.haml

.form-inline.clearfix
    .row
        .nested-fields
            = f.input :song_name,  placeholder: "Add Catalog Song", label: false, input_html: { class: 'form-input form-control'}
            #sub_catalogs
                = f.simple_fields_for :sub_catalogs do |sub_catalog|
                    = render 'sub_catalog_fields', f: sub_catalog
                .links
                    = link_to_add_association 'add Url', f, :sub_catalogs, class: 'btn btn-secondary add-button'
            = link_to_remove_association "Remove", f, class: 'btn btn-secondary form button'

sub_catalog_fields.html.haml

.form-inline.clearfix
    .row
        .nested-fields
            = f.input :sub_url,  placeholder: "URL", label: false, input_html: { class: 'form-input form-control'}
            = f.input :sub_url_type, collection: ["Youtube", "Spotify", "SoundCloud", "Apple Music", "Google Play"], input_html: { class: "form-control form-input" }
            = link_to_remove_association "Remove", f, class: 'btn btn-secondary form button'

1 个答案:

答案 0 :(得分:1)

我可以通过添加has_many :sub_catalogs, through: :catalogs, :dependent => :destroy&amp;来显示数据。 accepts_nested_attributes_for :sub_catalogs, :reject_if => :all_blank, :allow_destroy => true到我的必需品模型。