Rails:如何使用"返回id" (此代码中最后插入的ID)

时间:2016-03-03 17:35:38

标签: ruby-on-rails ruby

我已经阅读了关于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的书。对我来说,这有点先进。

2 个答案:

答案 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字段,您可以使用以下表单,该表单在提交后会为articlepictures设置{ {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