无法让模型在显示页面上用于提交和验证
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 好吧,我想这是一个新问题,那么,如果我已经回答了你的问题,如果你接受它会很好。至于新问题:您应该做的第一件事是仔细阅读错误消息以找出错误发生的位置(文件,行号......) - 也许您自己找到答案,如果没有,提供此信息与问题。 我的问题是我无法让表单正常工作。它含糊不清,但有一些问题我无能为力。 :) 会做 本质上是用户输入一个价格并提交它,并在产品表中的保留价格列中进行验证,如果它被接受,它会被添加到卡中,如果没有,尝试更高的报价等,现在我会发布其余的内容,我确实感谢您的帮助,我也在这里提供了完整的报价模型。你还有什么遗漏的吗?以上是关于无法让模型在显示页面上用于提交和验证的主要内容,如果未能解决你的问题,请参考以下文章