【问题标题】:simple_form undefined method `model_name' for NilClass:Class用于 NilClass:Class 的 simple_form 未定义方法“model_name”
【发布时间】:2014-02-17 23:02:59
【问题描述】:

我正在学习 Rails,我想使用 simple_form。 我正在创建一个简单的应用程序(我的第一个),并且我想创建一个注册表单。 我使用 rails g scaffold User username:string password:string 来创建我的模型和控制器。 我也在使用 Foundation gem,如果这很重要的话,我会使用 Foundation 的正确命令安装 simple_form。 我一直在寻找答案两个小时,我尝试了很多东西,我不知道我的代码有什么问题。

## app/views/home/index.html.erb ##
<%= simple_form_for @User do |f| %>
    <%= f.input :username %>
    <%= f.input :password %>
<% end %>

## app/models/user.rb ##
class User < ActiveRecord::Base
end


## app/controllers/users_controller.rb
class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]

  # GET /users
  # GET /users.json
  def index
    @users = User.all
  end

  # GET /users/1
  # GET /users/1.json
  def show
  end

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

  # GET /users/1/edit
  def edit
  end

  # POST /users
  # POST /users.json
  def create
    @user = User.new(user_params)

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

  # PATCH/PUT /users/1
  # PATCH/PUT /users/1.json
  def update
    respond_to do |format|
      if @user.update(user_params)
        format.html { redirect_to @user, notice: 'User was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /users/1
  # DELETE /users/1.json
  def destroy
    @user.destroy
    respond_to do |format|
      format.html { redirect_to users_url }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def user_params
      params.require(:user).permit(:username, :password)
    end
end

我显然做错了什么,我很确定我会觉得自己像个白痴,但这是我的第一个应用程序:/ 谢谢。 编辑:我忘了说,我(拼命地)尝试了每个变量(@user、@users、@User、@Users),它们中的任何一个都不起作用:/

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 simple-form


    【解决方案1】:

    index.html.erb 视图中删除表单(不,也不要将它放在show.html.erb 中!)。

    将此表单放在new.html.erb 视图中:

    <%= simple_form_for @user do |f| %>
      <%= f.input :username %>
      <%= f.input :password %>
      <%= f.submit %>
    <% end %>
    

    请注意,表单应引用@user 而不是@User

    【讨论】:

    • 在你生成脚手架的时候已经为你做好了路由,不要更改路由文件。
    • 好的,我知道你们所有的 cmets 出了什么问题。我还不习惯 Rails,而且我来自 PHP,所以......我犯了一个巨大的错误。我无法访问@user,因为我猜我不在正确的视图中,我在主视图中创建了一个用户。那是错误的部分,对吧?
    • 是的,您在错误的视图中,您在索引视图中,该视图仅具有列出所有用户的逻辑(在用户控制器中,每个函数与具有相同名称的 1 个视图匹配) .你有更多的问题吗?如果你得到这个工作考虑将其标记为正确答案
    • 是的,谢谢。我不会再犯这个错误了!顺便说一句,你知道如何在主页上创建一个注册/登录表单吗?
    • 是的,您应该看看一个名为 Devise 的 gem,它处理用户身份验证/授权。你可以在这里看到一个讨论它的视频:railscasts.com/episodes/209-introducing-devise
    【解决方案2】:

    是的...在视图中您使用的是@User 实例变量(带有大写U),但在控制器中您将模型分配给@user 实例变量(带有小写u):)

    【讨论】:

    • 我忘了说,我(拼命地)尝试了每个变量(@user@users@User@Users),它们中的任何一个都不起作用:/
    【解决方案3】:

    将@user 设为小写(不是@user)

    <%= simple_form_for @user do |f| %>
        <%= f.input :username %>
        <%= f.input :password %>
    <% end %>
    

    并将其保存为new.html.erb 查看而不是index.html.erb

    【讨论】:

    • 所以,我将get 'home/show' 添加到routes.rb,我将index.html.erb 重命名为show.html.erb,我仍然有同样的错误:/
    猜你喜欢
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多