我可以在不使用.each()的情况下渲染此集合吗?

问题描述:

我是新来的红宝石,但它似乎如果我有一个东西的集合,我应该能够呈现他们要么在一个循环或by defining a :collection我可以在不使用.each()的情况下渲染此集合吗?

在这里,每个花园可能有许多工厂分配给它。我有一个部分使植物处于“卡片”布局。此视图正确呈现为各园植物:

视图/花园/ show.html.haml

.row.plant-cards 
    - @garden.plants.each do |plant| 
    = render("shared/plants/card", {plant: plant, garden: @garden}) 

视图/共享/植物/ _card.html.haml

.col-md-2 
    .plant.thumbnail.text-center 
    = button_to("+", add_to_garden_path(plant, @garden.id), {method: :post ,remote: true}) 
    = link_to(plant) do 
     = image_tag("http://lorempixel.com/g/150/150/food/",:alt => plant.name) 
     %h4.plant__title.caption= plant.name 

我想通过ajax更新花园页面上的渲染植物。看起来我需要在.html()函数中粘贴渲染工厂“卡”的输出,使用.each()似乎很笨拙。好像我应该能够设置植物为:collection像我想下面做的,但是,这并不工作:

的意见/植物/ add_to_garden.js.erb (抱歉混合HAML/ERB - 我探索太)

<% flash.each do |key, message| %> 
    $("#flash").html("<%= j render partial: "shared/flash_message", locals: {key: key, message: message } %>"); 
<% end %> 
$(".plant-cards").html("<%= j render :partial => 'shared/plants/card', :collection => @garden.plants, :locals => {garden: @garden} %>"); 

当我做了Ajax调用我的应用程序得到这个运行时错误:

Started POST "/plants/2/add_to_garden/1" for ::1 at 2016-12-30 20:32:18 -0500 
Processing by PlantsController#add_to_garden as JS 
    Parameters: {"authenticity_token"=>"qJU/CEZudZFP9l6r1qdAlXJQrfY7fB0aZHmjRJh2yQO0IzxilP47mP2UjDDAmBNJouFtoAWkv/hJ2gCNR5BpgQ==", "id"=>"2", "garden_id"=>"1"} 
    Garden Load (0.3ms) SELECT `gardens`.* FROM `gardens` WHERE `gardens`.`id` = 1 LIMIT 1 
    Plant Load (0.2ms) SELECT `plants`.* FROM `plants` WHERE `plants`.`id` = 2 LIMIT 1 
    (0.1ms) BEGIN 
    SQL (0.2ms) INSERT INTO `gardens_plants` (`garden_id`, `plant_id`) VALUES (1, 2) 
    (160.8ms) COMMIT 
    (0.2ms) BEGIN 
    User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 
    (0.1ms) COMMIT 
    Rendered shared/_flash_message.html.erb (0.3ms) 
    Plant Load (0.5ms) SELECT `plants`.* FROM `plants` INNER JOIN `gardens_plants` ON `plants`.`id` = `gardens_plants`.`plant_id` WHERE `gardens_plants`.`garden_id` = 1 
    Rendered shared/plants/_card.html.haml (29.7ms) 
    Rendered plants/add_to_garden.js.erb (42.3ms) 
Completed 500 Internal Server Error in 238ms (ActiveRecord: 162.9ms) 

NameError - undefined local variable or method `plant' for #<#<Class:0x007fdf9be0f6c8>:0x007fdf9bce6350>: 
    app/views/shared/plants/_card.html.haml:3:in `_app_views_shared_plants__card_html_haml___4163891484537289381_70299132319600' 
    ... 
+0

在rails中,通常有多种方式来执行操作。将html插入到javascript中的方法并不是必需的。您可以轻松地将HTML放在隐藏节点中,并使用id参考它使用编号为 –

+1

尝试使用像这样:'' – Deep

+0

@Deep - 是的!完善。我忘了你可以指定一个集合'as:'但是那是我绕过的问题 - 谢谢。 – doub1ejack

只是把@深的回答到一个问题,他建议

Try using like this: <%= j render partial: 'shared/plants/card', collection: @garden.plants, as: :plant, locals: { garden: @garden } %>

将收集@ garden.plants指定为:plant这个技巧。