Ruby on rails RubyonRails创建记录时遇到的问题有很多:通过关系
我正在使用rails 3.2.14,第一次在使用has_many:through时遇到问题。我正在使用一个has_many:通过图像和设计表之间的关系,使用一个Design_Pictures表来存储设计图像的顺序排序。所有图像都与一个用户关联。稍后,我希望能够灵活地在images表中存储与特定设计无关的其他图像 我可以成功地将示例数据添加到数据库中,并在我的show design页面中显示图像标题(存储在images表中)和排名(存储在design_pictures表中)。我搞不懂的是如何创建一个新的设计图片。一旦我可以得到这个工作,我将使用CarrierWave或回形针添加图像到图像表 以下是我的模型: app/models/image.rb:Ruby on rails RubyonRails创建记录时遇到的问题有很多:通过关系,ruby-on-rails,ruby-on-rails-3.2,Ruby On Rails,Ruby On Rails 3.2,我正在使用rails 3.2.14,第一次在使用has_many:through时遇到问题。我正在使用一个has_many:通过图像和设计表之间的关系,使用一个Design_Pictures表来存储设计图像的顺序排序。所有图像都与一个用户关联。稍后,我希望能够灵活地在images表中存储与特定设计无关的其他图像 我可以成功地将示例数据添加到数据库中,并在我的show design页面中显示图像标题(存储在images表中)和排名(存储在design_pictures表中)。我搞不懂的是如何创建一
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
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
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
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
<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>
<%= 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/design\u pictures\u controller.rb
<li>
<%= design_picture.image.title %> - Ranking: <%= design_picture.ranking %>
</li>
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
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
<%= 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" %>
def show
@design = Design.find(params[:id])
@design_pictures = @design.design_pictures.find(:all, :limit => 10)
@design_picture = @design.design_pictures.build
end
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
访问design_图片表单部分时出错:
undefined method `title' for #<DesignPicture image_id: nil, design_id: 1427, ranking: nil>
未定义的方法“title”#
如果我从表单中删除标题,我可以提交表单,但不会创建任何内容
非常感谢您的帮助。您的
DesignPicture
没有title
属性。当您这样做时:
@design.design_pictures.build
它构建了一个新的DesignPicture
实例。以下情况不起作用:
<%= form_for(@design_picture) do |f| %>
# ...
<%= f.label :title, "Title" %>
# ...
# ...
# ...
您可能想看看我不确定这是否是最好的方法,但这就是我如何让我的表单提交并创建具有标题属性的图像条目和具有排名属性的设计图片条目的方法。我最终不需要使用accepts\u嵌套的属性 app/views/shared/\u design\u picture\u form.html.erb
<li>
<%= design_picture.image.title %> - Ranking: <%= design_picture.ranking %>
</li>
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
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
<%= 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" %>
def show
@design = Design.find(params[:id])
@design_pictures = @design.design_pictures.find(:all, :limit => 10)
@design_picture = @design.design_pictures.build
end
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
app/controllers/design\u pictures\u controller.rb
<li>
<%= design_picture.image.title %> - Ranking: <%= design_picture.ranking %>
</li>
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
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
<%= 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" %>
def show
@design = Design.find(params[:id])
@design_pictures = @design.design_pictures.find(:all, :limit => 10)
@design_picture = @design.design_pictures.build
end
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
由于
DesignPicture
属于Image
,如何让它使用Imagetitle
属性?您可以使用@design\u picture.design.title
访问它,感谢您指出嵌套表单。这是我问题的一部分。如果去掉title属性,它仍然不会创建任何内容。我认为我有一个更大的潜在问题,那就是我不知道如何使用has_-many:through关系创建新记录。我使用的是嵌套表单,但我认为我的控制器中有一个错误,那就是阻止它使用图像标题字段。你看到这有什么问题吗:def show@design=design.find(params[:id])@design\u pictures=@design.design\u pictures.find(:all,:limit=>10)@image=current\u user.images.build@design\u pictures=@design.design\u pictures.build end
没有问题,title
属性仅存在于@design
实例上。不在@design\u图片上
。您可以使用@design.respond_to?(:title)
和@design_picture.respond_to?(:title)