[英]Ruby on Rails trouble creating record with has_many :through relationship
我正在使用Rails 3.2.14,第一次使用has_many:through時遇到了麻煩。 我正在使用Design_Pictures表在Image和Design表之間使用has_many:through關系,該表將存儲設計圖像的訂單排名。 所有圖像都與一個用戶關聯。 稍后,我希望可以靈活地在“圖像”表中存儲與特定設計無關的其他圖像。
我可以成功地將樣本數據添加到數據庫中,並在我的顯示設計頁面中顯示圖像標題(存儲在圖像表中)和排名(存儲在design_pictures表中)。 我不知道如何創建一個新的design_picture。 一旦可以正常工作,我將使用CarrierWave或Paperclip將圖像添加到Image表中。
這是我的模型:
app / models / image.rb:
class Image < ActiveRecord::Base
attr_accessible :title
belongs_to :user
has_many :design_pictures, dependent: :destroy
has_many :designs, :through => :design_pictures
validates :user_id, presence: true
validates :title, length: { maximum: 80 }
end
app / models / design.rb:
class Design < ActiveRecord::Base
attr_accessible :title
has_many :design_pictures, dependent: :destroy
has_many :images, :through => :design_pictures
validates :title, presence: true, length: { maximum: 60 }
end
app / models / design_picture.rb:
class DesignPicture < ActiveRecord::Base
attr_accessible :ranking
belongs_to :image
belongs_to :design
validates :image_id, presence: true
validates :design_id, presence: true
default_scope order: 'design_pictures.ranking ASC'
end
app / models / user.rb:
class User < ActiveRecord::Base
attr_accessible :name
has_many :designs, dependent: :destroy
has_many :images, dependent: :destroy
validates :name, presence: true, length: { maximum: 50 }
end
觀看次數:
app / views / designs / show.html.erb:
<div>
<% if @design.design_pictures.any? %>
<h3>Images (<%= @design.design_pictures.count %>)</h3>
<ul>
<%= render @design_pictures %>
</ul>
<% end %>
</div>
<div>
<%= render 'shared/design_picture_form' %>
</div>
app / views / design_pictures / _design_picture.html.erb
<li>
<%= design_picture.image.title %> - Ranking: <%= design_picture.ranking %>
</li>
app / views / shared / _design_picture_form.html.erb:
<%= form_for(@design_picture) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.label :title, "Title" %>
<%= f.text_field :title,
placeholder: "Name your image.",
class: "" %>
<%= f.label :ranking, "Ranking" %>
<%= f.text_field :ranking,
placeholder: "Rank your design picture.",
class: "" %>
<%= hidden_field_tag(:design_id, @design.id) %>
<%= f.submit "Add Image", class: "btn btn-large btn-primary" %>
<% end %>
控制器:
app / controllers / designs_controller.rb
def show
@design = Design.find(params[:id])
@design_pictures = @design.design_pictures.find(:all, :limit => 10)
@image = current_user.images.build
@design_picture = @design.design_pictures.build
end
app / controllers / design_pictures_controller.rb
def create
@current_design = Design.find(params[:design_id])
@image = current_user.images.new(params[:title])
@design_picture = @current_design.design_pictures.build(:image_id => @image.id, params[:ranking])
if @design_picture.save
flash[:success] = "Micropost created!"
redirect_to @current_design
else
redirect_to designs_url
end
end
當我訪問design_picture表單部分時出錯:
undefined method `title' for #<DesignPicture image_id: nil, design_id: 1427, ranking: nil>
如果我從表單中刪除標題,則可以提交表單,但不會創建任何內容。
任何幫助將不勝感激。
您的DesignPicture
沒有title
屬性。 當您這樣做時:
@design.design_pictures.build
它構建一個新的DesignPicture
實例。 並且以下不起作用:
<%= form_for(@design_picture) do |f| %>
# ...
<%= f.label :title, "Title" %>
# ...
您可能想看一下嵌套表格
我不確定這是否是解決此問題的最佳方法,但這就是我能夠使表單提交並創建帶有title屬性的Image條目和帶有rank屬性的Design_Picture條目的方式。 我最終不需要使用accepts_nested_attributes_for。
app / views / shared / _design_picture_form.html.erb
<%= form_for(@design_picture) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= label_tag(:title, "Title") %>
<%= text_field_tag(:title) %>
<%= f.label :ranking, "Ranking" %>
<%= f.text_field :ranking,
placeholder: "Rank your design picture.",
class: "" %>
<%= hidden_field_tag(:design_id, @design.id) %>
<%= f.submit "Add Image", class: "btn btn-large btn-primary" %>
app / controllers / designs_controller.rb
def show
@design = Design.find(params[:id])
@design_pictures = @design.design_pictures.find(:all, :limit => 10)
@design_picture = @design.design_pictures.build
end
app / controllers / design_pictures_controller.rb
def create
@image = current_user.images.create(:title => params[:title])
@current_design = Design.find(params[:design_id])
@design_picture = @current_design.design_pictures.build(params[:design_picture])
@design_picture.image_id = @image.id
if @design_picture.save
flash[:success] = "Design Picture created!"
redirect_to @current_design
else
redirect_to designs_url
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.