我有以下show-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>
控制器
def show
@product = current_user.products.find(params[:id])
@products = Product.all
end
我的目标是在两种产品之间提供优惠。 我创建了Offer模型和制作商品的方法:
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
制作优惠有效,因为我在Console中查看了优惠。 我的问题出在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
问题在于以下一行(使用show-page中的链接来表示ID不同于1的产品):
@prod = current_user.products.find(1)
但我不知道如何在Db中找到我的节目页显示的实际产品的对象。不仅是id = 1。
答案 0 :(得分:7)
我不知道如何在数据库中找到此对象。
我不知道你问题的具体答案,但也许如果我解释你需要看什么,你的解决方案就会出现:
<强>查找强>
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框架,它将使你能够将你的对象相互关联,从而允许你从你的{{{{{{{{{{{ 1}}
当然,这是一种简单的方式。您将要查看此图表以了解其工作原理:
底线 - 尝试将应用程序视为一系列对象,而不是逻辑流程。这将有助于您了解实现这一目标所需的各种协会等
<强>资源强>
您提到您无法在展示页面上展示除{1}以外的products
产品。我认为问题是真的关于如何使offer
行动发挥作用。
如果是这种情况,请解释一下......
Rails是resource-based,意味着您执行/创建的所有内容需要以某种资源(对象)为中心。问题是很多人都不知道这一点,因此无缘无故地使控制器结构复杂化:
以上是典型的&#34; CRUD&#34;基于Rails的资源的路由结构。这应该演示通常构建Rails的方式 - 围绕资源
-
此外,Rails是基于MVC programming pattern
构建的 - 这意味着您需要使用控制器来填充一系列数据对象,以便在您的应用程序中使用。
为此,如果您加载资源,并希望使用另一个对象的资源信息填充它 - 您需要以确保您已设置数据对象以确保您可以正确查找它们,这可能意味着通过您的路由传递数据或使用持久数据类型,例如cookies
或sessions
您遇到的问题是您需要以某种方式将产品ID传递给控制器。我如何做到这一点如下(使用nested resources):
id
这样,您就可以为show
控制器加载产品的变量#config/routes.rb
resources :offers do
resources :products #-> domain.com/offers/2/products
end
,并为products
提供params[:id]
:
params[:offer_id]