1

第一次使用 ROR,我试图在表单提交时从索引视图创建一个新的模型对象。我想我明白了,但我得到:

uninitialized constant UsersController

在我看来,我有:

=form_for :user, :url => { :action => "new", :controller => "user" } do |f|
    = f.text_field :username, :placeholder => 'Username', :size => 30
    %br
    = f.text_field :email, :placeholder => 'E-mail', :size => 30
    %br
    = f.password_field :password, :placeholder => 'Password', :size => 30
    %br
    %br
    = f.submit_tag 'Sign Up'

在我的控制器中,我有:

def new
user_info = :params[:user]
    @user = User.create!(user_info)
    flash[:notice] = "#{@user.username} has been added!  Please fill out your profile page."
    redirect_to user_path
end

谁能明白我为什么会得到这个?

4

1 回答 1

1

第一个问题只是f.submit_tagform_for助手一起使用。其他的建议..

在 Rails 中执行这样的表单时,您应该使用该new操作设置一个空模型以供表单工作

def new
  @user = User.new

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

然后表单将提交给create操作,您可以在其中阅读params并使用它们来创建您将保存的用户对象

def create
  @user = User.new(params[:post])

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

此处的respond_to块可让您检查其他文件扩展名,通常是 .json 或 .xml,并为您提供一种为每个扩展名格式化输出的方法。

对于该show操作,您可以执行以下操作:

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

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

并转到 /users/1 您会看到呈现的视图(这是默认设置,因此那里的空行带有注释#show.html.erb,假设您有视图,则无需执行任何操作)

如果你去 /users/1.json 你会得到它的结果@user.to_json对于从你的 Javascript 与 Rails 交谈很有用

关于未定义的常量问题:

  1. 检查您的 UsersController 是否缺少任何end

  2. 检查相关的 User 模型和 UsersController 是否具有所有正确的命名约定,以免混淆 Rails

users_controller.rb:

class UsersController < ApplicationController
...
end

用户.rb:

class User < ActiveRecord::Base
...
end
于 2013-04-06T20:36:40.130 回答