【问题标题】:Rails nested attributes not displayed in SHOW/not saving parent idRails 嵌套属性未在 SHOW 中显示/未保存父 ID
【发布时间】:2018-02-27 10:44:11
【问题描述】:

当涉及到嵌套参数和它们的控制器时,我似乎无法掌握路由的窍门。稍后编辑 - 路线看起来不错,但 parent_id 没有保存

在我的路线中

   resources :galleries do
     resources :album
   end

然后在控制器中显示

def show
  @albums = Album.find(params[:id])
  @photos = @albums.photos.all

end

def index
  @albums = Album.includes(:photos).all


end

def new
   @gallery = Gallery.find(params[:gallery_id])
   @album = @gallery.albums.build
   @photos = @album.photos.build
end

def create
   @gallery = Gallery.find(params[:gallery_id])
   @album = @gallery.albums.new(album_params)

   respond_to do |format|
     if @album.save
       params[:photos]['image'].each do |a|
          @photo = @album.photos.create!(:image => a, :album_id => @album.id)
       end
       format.html { redirect_to gallery_path(@gallery.id), notice: 'Post was successfully created.' }

模型是这样的

class Album < ApplicationRecord
  belongs_to :gallery
  has_many :photos
  accepts_nested_attributes_for :photos
end

class Gallery < ApplicationRecord
  has_many :albums
  accepts_nested_attributes_for :albums
end

在我的画廊表单中,我可以看到所有画廊列的值。 现在我正在尝试为初学者显示这样的专辑列表,但没有任何显示:

<% @gallery.albums.each do |album| %>   
  <%= album.name %>
  <%= link_to "Destroy", album, method: :delete %>
<% end %>

原来我新建相册的时候没有保存画廊的parent_id

我这样称呼专辑创作

&lt;%= link_to 'New Album', new_gallery_album_path(@galleries.id) %&gt;

导致这个网址http://localhost:3000/galleries/1/albums

我不确定创建定义中缺少什么以便在我保存相册时保存 gallery_id

稍后编辑

在应用@Esther 的建议之前进行控制台

Gallery Load (1.0ms) SELECT "galleries".* FROM "galleries" WHERE "画廊"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] (0.0ms) BEGIN SQL (0.0ms) INSERT INTO "albums" ("band", "gallery_id", "created_at", "updated_at") 值 ($1, $2, $3, $4) 返回 "id" [["ban d", "test"], ["gallery_id", 1], ["created_at", "2017-09-18 21:09:59.805397"], ["updated_at", "2017-09-18 21:09:59.805397"]]
(0.0ms) 提交 (0.0ms) 开始

并且在修改控制器后使用@gallery.albums.create(album_params)而不是@gallery.albums.create

Gallery Load (0.0ms) SELECT "galleries".* FROM "galleries" WHERE "画廊"."id" = $1 限制 $2 [["id", 1], ["LIMIT", 1]] (0.0ms) 开始 SQL (1.0ms) INSERT INTO "albums" ("band", "gallery_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) 返回 "id" [[“禁止 d", "new"], ["gallery_id", 1], ["created_at", "2017-09-19 18:28:41.093138"], ["updated_at", "2017-09-19 18:28: 41.093138"]] (0.0ms) 提交 (0.0ms) 开始 (1.0ms) 提交 (0.0ms) 开始

【问题讨论】:

    标签: ruby-on-rails controller nested-forms


    【解决方案1】:

    “parent_id 未保存”是指gallery_id 未保存到album 吗?

    如果是,我的第一个想法是我认为您应该将相册创建方法中的这行代码从@album = @gallery.albums.new(album_params) 更改为@album = @gallery.albums.create(album_params)。这会立即使用album_params 中的现有参数创建相册,我希望在您继续将照片添加到相册之前将gallery_id 包含在其中。

    其次,您能否使用控制台中的日志更新您的问题,以便我们确认album_params 中的内容。

    【讨论】:

    • 谢谢@esther 不知道创建是这样的,但现在我也学会了这个。
    【解决方案2】:

    在我看来,没有任何与此画廊相关的专辑记录。您可以通过打印计数或使用调试语句来确认。

    # Example:
    There are <%= @albums.count %> albums associated with this gallery.
    
    # For debugging only:
    <%= debug @albums %>
    

    您也可以在控制台中看到这一点。

    @gallery.albums.count 
    @gallery.albums.any?
    

    如果您认为有问题,您可以直接检查数据库中的记录(运行 rails db 以使用相同的凭据连接到您的数据库),然后您可以执行 SQL:

    SELECT COUNT(*) FROM albums WHERE gallery_id = 1;
    

    【讨论】:

    • 谢谢@coreyward 我看到它们是用那个gallery_id创建的,但是在选择它们时确实没有出现。那么在我的创建/路径中还有一些其他的 Ifishy 等等。到时会去那里看看。也感谢格式化。掌握它的窍门
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多