加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 02:47:27 所属栏目:百科 来源:网络整理
导读:我有以下show-view,其中我显示有关产品的基本信息并显示其他用户的产品. h1Book %= @product.name %/h1% @products.each do |product| %ul %= product.name % %= link_to "Make offer",{controller: "offers",:action = 'create',id: product.id } %/ul 调节
我有以下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

问题是以下一行(对于不同ID不同于1的产品,使用show-page中的链接):

@prod = current_user.products.find(1)

但我不知道如何在Db中找到我的节目页显示的实际产品的对象.不仅是id = 1.

解决方法

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

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

Rails不是魔术 – 它使用ActiveRecord(这是一个ORM - Object-Relation Mapper),这意味着每次你发起一个查询(通过查找),你的ORM(ActiveRecord)将为你搜索相关的数据库数据

您遇到的问题是,虽然您正在使用正确的查找语法,但您的数据库中可能没有id为1的记录.

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

SELECT * FROM’products’WHERE user_id =’15’AND id =’1′

对象

此外,您必须记住,Ruby(以及基于Ruby构建的Rails)是面向对象的语言.这意味着您在语言中加载/交互的所有内容都应基于对象

您遇到的问题是您没有正确地将对象与Rails框架关联.我的意思如下所述,但基本上,如果你正确构建你的Rails框架,它将使你能够将你的对象相互关联,允许你从你的报价中调用你需要的各种产品

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

底线 – 尝试将应用程序视为一系列对象,而不是逻辑流程.这将有助于您了解所需的各种协会等,以使其向前发展

资源

你提到你不能在你的节目页面上显示除了一个以外的id的产品.我认为问题在于如何让你的表演行动起作用.

如果是这种情况,让我解释一下……

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

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

此外,Rails建立在MVC programming pattern上 – 这意味着您需要使用控制器来填充一系列数据对象,以便在您的应用程序中使用.

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

您遇到的问题是您需要以某种方式将产品ID传递给控制器??.我怎么做的如下(使用nested resources):

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

这将使您能够使用产品的变量params [:id]加载产品控制器,并为您的要约提供params [:offer_id]:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读