Ruby on Rails 4通过id查找对象

时间:2014-08-03 18:59:07

标签: 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>

控制器

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。

1 个答案:

答案 0 :(得分:7)

  

我不知道如何在数据库中找到此对象。

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


<强>查找

Rails并不神奇 - 它使用ActiveRecordORM - 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}}

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

enter image description here

底线 - 尝试将应用程序视为一系列对象,而不是逻辑流程。这将有助于您了解实现这一目标所需的各种协会等


<强>资源

您提到您无法在展示页面上展示除{1}以外的products产品。我认为问题是真的关于如何使offer行动发挥作用。

如果是这种情况,请解释一下......

Rails是resource-based,意味着您执行/创建的所有内容需要以某种资源(对象)为中心。问题是很多人都不知道这一点,因此无缘无故地使控制器结构复杂化:

enter image description here

以上是典型的&#34; CRUD&#34;基于Rails的资源的路由结构。这应该演示通常构建Rails的方式 - 围绕资源

-

此外,Rails是基于MVC programming pattern构建的 - 这意味着您需要使用控制器来填充一系列数据对象,以便在您的应用程序中使用。

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


您遇到的问题是您需要以某种方式将产品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]