我已经阅读了关于curval,lastval和最好的一个,返回id,但我看到的所有示例都是用普通的sql编写的(插入...)
但是,我在控制器中使用了活动记录。问题是我有一个新表单用文件上传字段添加文章,但我也想添加其他表中的图片,所以因为图表表有一个指向文章表的外键,我需要最后一个ID在我的照片表中插入。
以下是文章控制器中的方法
def create
@article = current_user.articles.build(article_params)
if @article.save
flash[:success] = "Article created!"
redirect_to root_url
else
render 'articles/new'
end
图片模型:
class Picture < ActiveRecord::Base
belongs_to :article
mount_uploader :picture, PictureUploader
end
文章模型有这个
class Article < ActiveRecord::Base
belongs_to :user
has_many :pictures
accepts_nested_attributes_for :pictures, allow_destroy: true
加上验证
更新
我已经读过,在这种情况下,通过编写Article.id,你得到了Article表中最后一个插入行的id,然而,问题的第二部分仍然存在,你如何使用它来添加它将命令保存到图片表。
那么,你怎么做呢?只需写下&#34;将ID返回到该行下方 if @ article.save? (这是在放弃清晰的SQL并且必须编写Active Record时出现的那种问题,我迷失了它。然后到目前为止还不清楚如何将返回的id添加到图片中的Save方法。 更新2:
我包含了强大的参数
def article_params
params.require(:article).permit(:country, :region, :town, :street, :company, :title, :content, :picture)
end
表格的顶部
<%= form_for(@article, html: { multipart: true }) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
我的更新:
答案仍然不正确,因为首先在表单中的fields_for中有一个小错误导致图片不被发送到控制器。
但是一旦有人帮助我,仍然存在一个问题,即图片根本无法保存。
我查看了日志,我可以阅读:未经许可的参数图片。这就是说,当涉及到Pictures表时,强参数私有方法是不正确的。也就是说,这不正确:
params.require(:article).permit(:country, :region, :town, :street, :company, :title, :content, :picture)
但属性图片必须按照以下部分细分:
def article_params
params.require(:article).permit(:country, :region, :town, :street, :company, :title, :content, pictures_attributes: [:id, :article_id, :picture])
end
这最终解决了这个问题,但是对于那些自己教Rails两周的人来说,这是一个挑战,尽管已经阅读了大部分指南甚至是Hartl的书。对我来说,这有点先进。
答案 0 :(得分:2)
如果您要在文章表单中直接添加图片,则应该按原样构建图片。
@article = current_user.articles.build(article_params)
@article.pictures.build
并在models/article.rb
添加accepts_nested_attributes_for :pictures
。这样你就可以添加f.form_for :pictures do |ff|
。请记住将属性添加到强参数中。
答案 1 :(得分:0)
创建article
时,您无需手动将article_id
分配给picture
对象。
对于所有模型,关联和使用适当的表单助手,您可以让rails
为您处理。
假设title
表中有articles
字段,您可以使用以下表单,该表单在提交后会为article
和pictures
设置{ {1}}。
article
您还需要在<%= form_for @article, html: { multipart: true } do |f| %>
<%= f.text_field :title %>
<%= fields_for :pictures do |ff| %>
<%= ff.file_field :picture %>
<% end %>
<% end %>
的{{1}}操作中设置/构建这些pictures
,如下所示:
new
让ArticlesController
知道您要接受来自class ArticlesController < ApplicationController
def new
@article = current_user.articles.build
@article.pictures.build
end
end
模型的rails
个参数,如下所示:
picture
有关详细信息,请参阅FormHelpers#fields_for。