访问嵌套表单数据 rails 4
Accessing nested form data rails 4
我有一个包含嵌套字段的表单,其中包含另一个嵌套字段。所有表单数据都保存到数据库中,但我的问题是我无法在视图中显示第二个嵌套字段数据。我有一个基本模型,它有很多目录,目录有很多 sub_catalogs。我正在使用 rails 4、cocoon 和 HAML。
基本控制器
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'
我能够通过将 has_many :sub_catalogs, through: :catalogs, :dependent => :destroy
& accepts_nested_attributes_for :sub_catalogs, :reject_if => :all_blank, :allow_destroy => true
添加到我的基本模型来显示数据。
我有一个包含嵌套字段的表单,其中包含另一个嵌套字段。所有表单数据都保存到数据库中,但我的问题是我无法在视图中显示第二个嵌套字段数据。我有一个基本模型,它有很多目录,目录有很多 sub_catalogs。我正在使用 rails 4、cocoon 和 HAML。
基本控制器
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'
我能够通过将 has_many :sub_catalogs, through: :catalogs, :dependent => :destroy
& accepts_nested_attributes_for :sub_catalogs, :reject_if => :all_blank, :allow_destroy => true
添加到我的基本模型来显示数据。