形式中的第一个参数不能包含 nil 或为空 哈特尔的轨道 4 教程



我正在学习Michael Hartl的Rails教程,我在7.3.3节中遇到了一个问题。 我收到此错误消息:

ArgumentError in Users#new
Showing /Users/Anuraag/rails_projects/sample_app/app/views/users/new.html.erb where line #6 raised:
First argument in form cannot contain nil or be empty

当我运行以下 rspec 时:

bundle exec rspec spec/requests/user_pages_spec.rb -e "signup with invalid information"

在下一行:

<%= form_for(@user) do |f| %>

这是我的代码。 如果我没有很好地构建这个问题,也请告诉我应该如何改进这个问题:我对 StackOverflow 也很陌生

app/views/users/new.html.erb:

<% provide(:title, 'Sign up') %>
<h1>Sign up</h1>
<div class="row">
  <div class="span6 offset3">
    <%= form_for(@user) do |f| %>
      <%= render 'shared/error_messages' %>
      <%= f.label :name %>
      <%= f.text_field :name %>
      <%= f.label :email %>
      <%= f.text_field :email %>
      <%= f.label :password %>
      <%= f.password_field :password %>
      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation %>
      <%= f.submit "Create my account", class: "btn btn-large btn-primary" %>
    <% end %>
  </div>
</div>

app/assets/controllers/users_controller.rb:

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  end
  def create
    @user = User.new(user_params)
    if @user.save
      # Handle a successful save.
    else
      render 'new'
    end
  end
  private
    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end
end

spec/requests/user_pages_spec.rb

require 'spec_helper'
describe "User pages" do
  subject { page }
  describe "signup page" do
    before { visit signup_path }
    it { should have_content('Sign up') }
    it { should have_title(full_title('Sign up')) }
  end
  describe "profile page" do
    let(:user) { FactoryGirl.create(:user) }
    before { visit user_path(user) }
    it { should have_content(user.name) }
    it { should have_title(user.name) }
  end
  describe "signup" do
    before { visit signup_path }
    let(:submit) { "Create my account" }
    describe "with invalid information" do
      it "should not create a user" do
        expect { click_button submit }.not_to change(User, :count)
      end
    end
    describe "with valid information" do
      before do
        fill_in "Name",         with: "Example User"
        fill_in "Email",        with: "user@example.com"
        fill_in "Password",     with: "foobar"
        fill_in "Confirmation", with: "foobar"
      end
      it "should create a user" do
        expect { click_button submit }.to change(User, :count).by(1)
      end
    end
  end
end

new.html.erb中,您已经指定了form_for(@user)这意味着在调用new操作之前,您需要在实例变量@user中具有一些值。

您可以通过两种方式执行此操作:

一种方法是在控制器中定义一个操作new,该操作将在渲染new.html.erb布局之前调用。例如:

def new
  @user = User.new
end

另一种方法是,在您的表单本身中,您可以指定类似的东西

<%= form_for(User.new) do |f| %>

new操作中定义它是更标准的方式。

控制器文件中的操作顺序很重要。我有同样的错误,直到我找出操作方法顺序的问题。例。控制器文件

def edit
  @post = Post.find(params[:id])
end
def update
end
private
def post_params
    params.require(:post).permit(:title, :body)
end

我正在处理编辑操作,但遇到了与您相同的错误。问题是我已经在私人操作下编写了编辑操作。 一旦我更改了此操作的顺序。它就像一个魅力。

我想达到什么目的?我试图获取帖子实例变量的值并将其用于 html 形式。

我没有在您的控制器上看到新操作。

def new
  @user = User.new
end

我可能是间接的,但自己定义它并没有什么坏处。从你的标题来看,这可能是@user变量为 nil 的原因,它没有定义。

相关内容

  • 没有找到相关文章

最新更新