gpt4 book ai didi

ruby-on-rails - Ruby on Rails 4 通过 id 查找对象

转载 作者:行者123 更新时间:2023-12-03 03:30:24 26 4
gpt4 key购买 nike

我有以下显示 View ,其中显示有关产品的基本信息并显示其他用户的产品。

<h1>Book <%= @product.name %></h1>
<% @products.each do |product| %>
<ul>
<%= product.name %>
<%= link_to "Make offer", {controller: "offers", :action => 'create', id: product.id } %>
</ul>

Controller

def show
@product = current_user.products.find(params[:id])
@products = Product.all
end

我的目标是在两种产品之间进行报价。我创建了报价模型和报价方法:

class Offer < ActiveRecord::Base
belongs_to :product

belongs_to :exchanger, class_name: "Product", foreign_key: "exchanger_id"

validates :product_id, :exchanger_id, presence: true

def self.request(product, exchanger)
unless product == exchanger or Offer.exists?(product, exchanger)
transaction do
create(product: product, exchanger: exchanger, status: "oczekujace")
create(product: exchanger, exchanger: product, status: "oferta")
end
end
#other methods
end

报价正在起作用,因为我在控制台中检查了它。我的问题出在 OffersController 中:

class OffersController < ApplicationController
before_filter :setup_products

def create
Offer.request(@prod, @exchanger)
redirect_to root_path
end

private

def setup_products
@prod = current_user.products.find(1)
@exchanger = Product.find_by_id(params[:id])
end
end

问题出在以下一行(在显示页面中使用 id 大于 1 个作品的产品链接):

@prod = current_user.products.find(1)

但我不知道如何在数据库中查找我的显示页面显示的实际产品的对象。不仅适用于 id = 1。

最佳答案

I don't know how to find this object in database.

我不知道你的问题的具体答案,但也许如果我解释一下你需要看什么,你的解决方案就会出现:

<小时/>

查找

Rails 并不神奇 - 它使用 ActiveRecord (这是一个 ORM - Object-Relation Mapper ),这意味着每次您触发查询(通过 find )时,您的 ORM (ActiveRecord) 都会为您搜索相关的数据库数据

您遇到的问题是,尽管您使用正确的语法进行查找,但您可能没有 id 的记录。的1在你的数据库中。

current_user.products.find(1)告诉 ActiveRecord 将查询范围限制在当前用户及其产品范围内。所以你会得到像这样的东西:

SELECT * FROM 'products' WHERE user_id = '15' AND id = '1'

<小时/>

对象

此外,您必须记住 Ruby(以及基于 Ruby 构建的 Rails)是 object orientated语言。这意味着您用语言加载/交互的所有内容应该基于对象

您遇到的问题是您没有将对象正确关联到 Rails 框架。我的意思如下所述,但本质上,如果您正确构建 Rails 框架,它将使您能够将对象相互关联,从而允许您调用各种 products您需要从您的offer

当然,这是一种简单化的看待方式。您需要查看此图以了解其工作原理:

enter image description here

底线 - 尝试将您的应用程序视为一系列对象,而不是逻辑流。这将帮助您了解插入其向前发展所需的各种关联等

<小时/>

资源

您提到您无法在 id 的展示页面上显示产品除了一个之外。我认为问题实际上是如何获取 show行动去工作。

如果是这样的话,让我解释一下......

Rails 是 resource-based ,这意味着您所做/创建的一切需要以某种资源(对象)为中心。问题是很多人不知道这一点,因此无缘无故地使他们的 Controller 结构复杂化:

enter image description here

以上是基于 Rails 的资源的典型“CRUD”路由结构。这应该演示 Rails 通常构建的方式——围绕资源

--

此外,Rails 构建于 MVC programming pattern 之上- 意味着您需要使用 Controller 来填充一系列数据对象以在您的应用程序中使用。

为此,如果您加载资源,并希望用另一个对象的资源信息填充它 - 您需要确保您已以某种方式设置数据对象,以确保可以正确查找它们,这意味着通过路由传递数据或使用持久数据类型,例如 cookies sessions

<小时/>

您遇到的问题是您需要以某种方式将产品ID传递给您的 Controller 。我的做法如下(使用 nested resources ):

#config/routes.rb
resources :offers do
resources :products #-> domain.com/offers/2/products
end

这将使您能够加载 products具有变量的 Controller params[:id]对于产品,以及params[:offer_id]为您Offer可用:

#app/controllers/products_controller.rb
Class ProductsController < ApplicationController
def show
@offer = Offer.find params[:offer_id]
@product = Product.find params[:id]
end
end

关于ruby-on-rails - Ruby on Rails 4 通过 id 查找对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25108029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com