Prz*_*903 4 ruby-on-rails ruby-on-rails-4
我有以下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>
Run Code Online (Sandbox Code Playgroud)
调节器
def show
@product = current_user.products.find(params[:id])
@products = Product.all
end
Run Code Online (Sandbox Code Playgroud)
我的目标是在两种产品之间提供优惠.我创建了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
Run Code Online (Sandbox Code Playgroud)
提供优惠是有效的,因为我在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
Run Code Online (Sandbox Code Playgroud)
问题是以下一行(对于不同ID不同于1的产品,使用show-page中的链接):
@prod = current_user.products.find(1)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何在Db中找到我的节目页显示的实际产品的对象.不仅是id = 1.
我不知道如何在数据库中找到这个对象.
我不知道你问题的具体答案,但也许如果我解释你需要看什么,你的解决方案就会出现:
找
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
当然,这是一种看待它的简单方式.您需要查看此图表以了解其工作原理:

底线 - 尝试将应用程序视为一系列对象,而不是逻辑流程.这将有助于您了解所需的各种协会等,以使其向前发展
资源
您提到您无法在展示页面上显示该产品id.我认为问题实际上是关于如何让你的show行动发挥作用.
如果是这种情况,让我解释一下......
Rails是基于资源的,这意味着您执行/创建的所有内容都需要以某种资源(对象)为中心.问题是许多人不知道这一点,因此无缘无故地使他们的控制器结构复杂化:

以上是基于Rails的资源的典型"CRUD"路由结构.这应该展示Rails通常构建的方式 - 围绕资源
-
此外,Rails建立在MVC programming pattern- 意味着您需要使用控制器来填充一系列数据对象以供在您的应用程序中使用.
为此,如果您加载资源,并希望用另一个对象的资源信息填充它 - 您需要确保以某种方式设置数据对象,以确保您可以正确查找它们,这意味着通过数据通过您的路由或使用持久数据类型,如cookies或sessions
您遇到的问题是您需要以某种方式将产品ID传递给控制器.我是怎么做的如下(使用嵌套资源):
#config/routes.rb
resources :offers do
resources :products #-> domain.com/offers/2/products
end
Run Code Online (Sandbox Code Playgroud)
这将使您能够products使用产品的变量加载控制器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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5557 次 |
| 最近记录: |