在#show 上呈现结果而不将数据存储在 ActiveStorage 中

Render results on #show without storing data in ActiveStorage

我正在通过构建我的第一个应用程序来学习 RoR(耶!)。我想问一个问题,因为 rails 指南没有涵盖这个主题:

如何在不在模型中存储任何数据的情况下在 #show 上向用户呈现独特的结果?

我想走的步数:

  1. 创建一个带有 form_tag 的基本 index 视图,允许用户提交 link(字符串)并单击提交按钮
  2. 编写允许我解析的服务对象 link 并创建我希望用户看到的响应
  3. 我想在一个单独的控制器中编写一个#show 方法来显示所有数据。 (我还想使用服务对象在该方法中解析我的参数 [:link]。
  4. 我想最终在#show 视图中的 table 中显示此数据(可能我需要为每个用户创建一个唯一的#show/[:id]?

这是我的应用目前的样子(大致):

Static Controller(只是用表单渲染 index.html.erb)

class StaticController < ApplicationController
  def index
  end
end

静态索引视图(是的,在这里解析 imgur link)

<h1>Hello Rails!</h1>

<%= form_tag("/images", method: "post") do %>
  <p>
    <%= label_tag(:imgur_link) %><br>
    <%= text_field_tag(:imgur) %>
  </p>
  <p>
    <%= submit_tag("Get my cards") %>
  </p>
    <% end %>

图像控制器(所有魔法都应该在这里发生)

class ImagesController < ApplicationController

  def show
    @collection = params[:imgur_link]
    @service1 = service1.new(*args).call
    @service2 = service2.new(*args).call
    ...
  end
end

图片显示视图

空的,因为我现在一直在使用图像控制器。

如有任何帮助,我们将不胜感激。 谢谢!

您没有理由为了展示而将某物放入储藏室。如果您在控制器中获得结果时到达某个点,您可以将它们传递给一些 @variable

查看

正如我所见,您已经为第 1 步设置了表格。如果您还 routes.rbPOST /images 调用 'images#show',那么您将有 params[:imgur_link]在您的表演动作中可用。应该这样做:

# config/routes.rb
YourApplication.routes.draw do 
  # ...
  post '/images' => 'images#show'
end

现在您必须以某种方式处理 link。由于我不知道你的结果应该是什么,我假设你有两个 classes,Service1Service2,它们都接受 URL 和 return 结果集合,并且两个集合都包含相同 class 的元素。然后您可以只为您的 show 视图保留独特的结果,如下所示:

# app/controllers/images_controller.rb
class ImagesController < ApplicationController
  def show
    link = params[:imgur_link]
    results1 = Service1.new(link).results
    results2 = Service2.new(link).results

    @results = (results1 + results2).uniq
  end
end

然后您可以在 show 视图中使用 @results 做一些事情。例如

# app/views/images/show.html.erb
<% @results.each do |result| %>
  <%= result.inspect %>
<% end %>