【问题标题】:Can I render this collection without using .each()?我可以在不使用 .each() 的情况下渲染这个集合吗?
【发布时间】:2017-05-15 06:04:00
【问题描述】:

我是 ruby​​ 新手,但如果我有很多东西,我应该能够在循环或by defining a :collection 中渲染它们。

在这里,每个花园都可能分配有许多植物。我有一个以“卡片”布局呈现植物的部分。此视图正确地渲染了每个花园的植物:

views/gardens/show.html.haml

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

views/shared/plants/_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,就像我在下面尝试做的那样,但这不起作用:

views/plants/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'
  ...

【问题讨论】:

  • 在 Rails 中,通常有多种方法可以做事。您将 html 插入 javascript 的方法并不是真正必要的。您可以轻松地将 html 放在隐藏节点中,并使用 id 从 javascript 中引用它
  • 尝试这样使用:&lt;%= j render partial: 'shared/plants/card', collection: @garden.plants, as: :plant, locals: { garden: @garden } %&gt;
  • @Deep - 是的!完美的。我忘了你可以指定一个集合 as: 一些东西,但这是我一直在讨论的问题 - 谢谢。
  • @maxple,我的目的是在花园中添加新植物时刷新植物。如果我理解正确,我认为我不能将 html 放在隐藏节点中,对吗?因为随着新植物的添加,该 html 将变得过时。

标签: ruby-on-rails ruby ajax render


【解决方案1】:

他建议将@Deep 的答案放入一个问题中

尝试这样使用:&lt;%= j render partial: 'shared/plants/card', collection: @garden.plants, as: :plant, locals: { garden: @garden } %&gt;

将集合 @garden.plants 指定为 :plant 就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2021-09-16
    • 2014-04-02
    • 2016-09-12
    • 2016-11-07
    • 2022-08-05
    相关资源
    最近更新 更多