ruby-on-rails – Ruby on Rails 4通过id查找对象
我有以下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 我的目标是在两种产品之间提供优惠. 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中检查了它. 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. 解决方法
我不知道你问题的具体答案,但也许如果我解释你需要看什么,你的解决方案就会出现: 找 Rails不是魔术 – 它使用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建立在 为此,如果您加载资源,并希望用另一个对象的资源信息填充它 – 您需要确保以某种方式设置数据对象,以确保您可以正确查找它们,这意味着通过通过您的路由或使用持久数据类型的数据,例如 您遇到的问题是您需要以某种方式将产品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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |