尝试在Ruby on Rails中使用表单提交创建模型对象

时间:2013-04-06 20:23:46

标签: ruby-on-rails forms

第一次使用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

谁能明白我为什么会这样?

1 个答案:

答案 0 :(得分: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你没有做任何事情,假设你有一个视图)< / p>

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

关于未定义的常数问题:

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

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

  3. users_controller.rb:

    class UsersController < ApplicationController
    ...
    end
    

    user.rb:

    class User < ActiveRecord::Base
    ...
    end