无法让模型在显示页面上用于提交和验证

Posted

技术标签:

【中文标题】无法让模型在显示页面上用于提交和验证【英文标题】:Cant get model working for submit and validation on the show page 【发布时间】:2012-07-24 11:11:11 【问题描述】:

我正在做一个项目,我对 Rails 很陌生,

我无法弄清楚到底出了什么问题。 我收到此错误。

产品中的 NoMethodError#index

未初始化的常量 ProductsController::Offer

基本上我有一个正在尝试实现的功能。

在我的产品表中,我有一个名为底价的列,我希望用户在产品页面上的表单上提交一个数字,然后验证底价,如果接受它会添加到购物车,如果不闪请输入更高的报价,

问题是我似乎无法弄清楚如何让模型和控制器协同工作。

我整个星期都在做这个,但我仍然不知道。

我想知道是否有人可以查看我的代码并查看我缺少的视图页面我收到的错误是 NilClass:Class 的未定义方法 `model_name' 我确定我输入了正确的模型模型,如果我能完成这项工作,我可以快速完成其余的工作,但我不知道我错过了什么。

提供控制器.rb 类 OffersController

attr_accessible :product, :offer , :reserve_price

定义新 @offer = Offer.new 结束

end

提供模型.rb

   class Offer < ActiveRecord::Base

belongs_to :product has_many :reserve_prices

attr_accessible :product, :offer , :reserve_price

validates_presence_of :offer 验证:ensure_meets_reserve_price

私人的 def ensure_meets_reserve_price 如果金额

私人的 def Reserve_price product.reserve_price 结束

定义 your_offer @your_offer = Offer.new

结束

定义新 @offer = Offer.new = :your_offer 结束

 end

产品索引视图文件

   class ProductsController < ApplicationController

before_filter :authenticate, :except => [:index, :show]

# GET /产品 # 获取 /products.xml

定义索引 @offer = Offer.new

@products = Product.search(params[:search_query])

respond_to do |format|
  format.html # index.html.erb
  format.xml   render :xml => @products 
end

结束

# GET /products/1 # 获取 /products/1.xml 默认显示

  @product = Product.find(params[:id])


respond_to do |format|
  format.html # show.html.erb
  format.xml   render :xml => @product 
end

结束

# GET /products/new # 获取 /products/new.xml 定义新 @product = Product.new

respond_to do |format|
  format.html # new.html.erb
  format.xml   render :xml => @product 
end

结束

# GET /products/1/edit 定义编辑 @product = Product.find(params[:id]) 结束

# POST /产品 # 发布 /products.xml 定义创建 @product = current_user.products.new(params[:product])

respond_to do |format|
  if @product.save
    format.html  redirect_to(@product, :notice => 'Product was successfully created.') 
    format.xml   render :xml => @product, :status => :created, :location => @product 
  else
    format.html  render :action => "new" 
    format.xml   render :xml => @product.errors, :status => :unprocessable_entity 
  end
end

结束

#PUT /products/1 # 放置 /products/1.xml 定义更新 @product = Product.find(params[:id])

respond_to do |format|
  if @product.update_attributes(params[:product])
    format.html  redirect_to(@product, :notice => 'Product was successfully updated.') 
    format.xml   head :ok 
  else
    format.html  render :action => "edit" 
    format.xml   render :xml => @product.errors, :status => :unprocessable_entity 
  end
end

结束

#删除 /products/1 # 删除 /products/1.xml 定义破坏 @product = Product.find(params[:id]) @product.destroy

respond_to do |format|
  format.html  redirect_to(products_url) 
  format.xml   head :ok 
end

结束 结束

产品控制器.rb

class ProductsController < ApplicationController
  before_filter :authenticate, :except => [:index, :show]

  # GET /products
  # GET /products.xml
  def index
    @products = Product.search(params[:search_query])

    respond_to do |format|
      format.html # index.html.erb
      format.xml   render :xml => @products 
    end
  end

  # GET /products/1
  # GET /products/1.xml
  def show
    @product = Product.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml   render :xml => @product 
    end
  end

  # GET /products/new
  # GET /products/new.xml
  def new
    @product = Product.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml   render :xml => @product 
    end
  end

  # GET /products/1/edit
  def edit
    @product = Product.find(params[:id])
  end

  # POST /products
  # POST /products.xml
  def create
    @product = current_user.products.new(params[:product])

    respond_to do |format|
      if @product.save
        format.html  redirect_to(@product, :notice => 'Product was successfully created.') 
        format.xml   render :xml => @product, :status => :created, :location => @product 
      else
        format.html  render :action => "new" 
        format.xml   render :xml => @product.errors, :status => :unprocessable_entity 
      end
    end
  end
 # PUT /products/1
 # PUT /products/1.xml
 def update
   @product = Product.find(params[:id])

   respond_to do |format|
     if @product.update_attributes(params[:product])
       format.html  redirect_to(@product, :notice => 'Product was successfully updated.') 
       format.xml   head :ok 
     else
       format.html  render :action => "edit" 
       format.xml   render :xml => @product.errors, :status => :unprocessable_entity 
     end
   end
 end

 # DELETE /products/1
 # DELETE /products/1.xml
 def destroy
   @product = Product.find(params[:id])
   @product.destroy

   respond_to do |format|
     format.html  redirect_to(products_url) 
     format.xml   head :ok 
   end
 end
       end

有什么帮助吗?

很高兴我已经有一段时间了,但还没有弄清楚!

【问题讨论】:

您的视图属于哪个操作? 该视图是一个产品索引视图,我只是将 form_for 自身粘贴为它没有链接,这是我的第一个问题 :) 你需要使用嵌套资源,你可以发布你的产品控制器吗? 完成 :) 您的帮助非常有用 您的代码需要一些修复。喜欢belongs_to :product has_many :reserve_prices 而不是belongs_to :products has_many :reserve_price。 Offer 模型中的最后两个私有方法很奇怪。 【参考方案1】:

如果我正确理解您的问题:

访问产品时显示错误#show

您想在产品#show 页面中包含报价表

在这种情况下,您需要像这样在 ProductsController 显示操作中初始化 @offer 变量:

@offer = Offer.new

添加

到下一个问题: ProductsController::Offer 是未知的,它不应该是因为你有一个 Offer 模型。我刚刚尝试将您的 Offer 表单包含到一个 show 操作中,并且它显示它没问题,除了您使用新的 Offer 实例初始化该字段之外。 (也许是一个数量?)。无论如何,我无法从您的代码 sn-ps 中看到为什么 Offer 模型在您的控制器中不可用。能否提供完整的源码?

我首先怀疑你在Offer中奇怪的私有方法

 def your_offer
     @your_offer = Offer.new

   end

def new
  @offer = Offer.new = :your_offer
end

是原因,但我已将它们包括在内,并且表单呈现良好。但我到底该怎么办?

【讨论】:

是的,页面不会显示其中的表单,当我更新产品控制器时,我仍然在 Products#index undefined method `model_name' for NilClass:Class 中得到这个 NoMethodError 对不起,我想我弄错了 :) 我把它放在产品的显示和索引中,现在我得到一个不同的错误,所以进展:) 它的未初始化常量 ProductsController::Offer 好吧,我想这是一个新问题,那么,如果我已经回答了你的问题,如果你接受它会很好。至于新问题:您应该做的第一件事是仔细阅读错误消息以找出错误发生的位置(文件,行号......) - 也许您自己找到答案,如果没有,提供此信息与问题。 我的问题是我无法让表单正常工作。它含糊不清,但有一些问题我无能为力。 :) 会做 本质上是用户输入一个价格并提交它,并在产品表中的保留价格列中进行验证,如果它被接受,它会被添加到卡中,如果没有,尝试更高的报价等,现在我会发布其余的内容,我确实感谢您的帮助,我也在这里提供了完整的报价模型。你还有什么遗漏的吗?

以上是关于无法让模型在显示页面上用于提交和验证的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 验证不适用于引导模式

模型驱动形式:验证在 Angular 2 中无法按预期工作

Javascript 无法停止页面加载

一个随机数发生器 用于在服务器和客户机直接进行安全性验证的类

使用 jQuery 验证验证和访问多个页面上的表单

html问题。一个FORM表单,怎样让submit验证指定数据,验证成功后在提交至指定页面中呢?