用ORM mangomapper生成的Rails代码抛出NoMethodError(未定义的方法`each'代表“4d2aeaea4403baa84a000005”:String)

时间:2011-01-10 12:19:38

标签: ruby-on-rails mongodb mongomapper mongodb-ruby

我对Rails和MongoDB完全是新闻。我一直在关注一本好书中的教程,并使用轻松的Twitter副本创建我的第一个Rails应用程序。一切都很顺利。

但作为我学习过程的一部分,我想使用MongoDB而不是默认的SGBD构建相同的应用程序。

因此我配置了mongo并安装了mongo_mapper gem。在本教程之后,所有内容都已正确配置:http://www.mongodb.org/display/DOCS/Rails+3+-+Getting+Started。然后我挣扎了一点,让Rails生成工作而不会让我---没有指定错误。为了解决这个问题,我必须添加rails3-generators gem并将其添加到Gemfile中。

完成所有这些后,一切正常。我能够成功启动Rails服务器。

由于生成,我添加了一个用户控制器。该页面工作正常,甚至列出了我之前添加的用户:

alt text

然而,所有其他操作,显示,编辑,删除等都无法正常工作(创建作品,但随后显示并出现错误):

alt text

对于所有不同的操作,它几乎都是相同的错误。

我可以立即注意到的一个区别是,对于非MongoDB数据库,用户的id从1开始,等等。但是在MongoDB中,它看起来像一个随机生成的id,它复杂得多,不属于int类型:4d2ae91d4403baa84a000002

我认为这可能会产生问题,因为所有操作都使用id作为参数......但我不知道如何解决这个问题。我查看了ruby生成的代码,它看起来没问题(非常类似于为默认数据库生成的代码)。

任何帮助将不胜感激!我不知道如何在不使用mongodb解决简单生成代码的情况下继续我的项目。

谢谢,

亚历

PS: 请我根本不写任何代码。一切都已经产生了,这就是为什么我期望从开始工作......

这里询问的是users_controllers的代码:

class UsersController < ApplicationController
  # GET /users
  # GET /users.xml
  def index
    @users = User.all

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

  # GET /users/1
  # GET /users/1.xml
  def show
@user = User.first(params[:id])

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

  # GET /users/new
  # GET /users/new.xml
  def new
@user = User.new

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

# GET /users/1/edit
  def edit
@user = User.first(params[:id])
  end

  # POST /users
  # POST /users.xml
  def create
    @user = User.new(params[:user])

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

  # PUT /users/1
  # PUT /users/1.xml
  def update
@user = User.first(params[:id])

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

  # DELETE /users/1
  # DELETE /users/1.xml
  def destroy
@user = User.first(params[:id])
@user.destroy

respond_to do |format|
  format.html { redirect_to(users_url) }
  format.xml  { head :ok }
end
  end
end

1 个答案:

答案 0 :(得分:1)

嗯,所以我似乎找到了pb ......

我换了:

@user = User.first(params[:id])

通过

@user = User.find(params[:id])

但是,再次生成了这段代码......那么错误来自哪里? rails3-generators中是否存在“bug”?或者不知怎的,我搞砸了这一代?

亚历