2014-09-21 43 views
0

我試圖通過遵循 邁克爾哈特的Rubyonrails書建立用戶註冊表單。 Chapter 7:Singup將@user變量添加到新動作的原因(def new @user = User.new end)

但是我根本無法將我的頭包裹在這段小小的代碼中。

def new 
    @user = User.new 
    end 

我想知道上面的代碼的目的是什麼,它是如何工作的?

如果我排除上面的代碼(@用戶= User.new)故意,它會拋出錯誤消息說:

raised: First argument in form cannot contain nil or be empty 

如果在形式上第一個參數不能包含零或爲空,爲什麼宣佈@user = User.new獲得通過,因爲它將nil賦值給用戶對象。我對rails的天真理解在這裏可能是錯誤的。

這裏是全碼

控制器/ user_controller.rb

class UsersController < ApplicationController 
    def show 
    @user = User.find(params[:id]) 
    end 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) # Not the final implementation! 
    if @user.save 
     flash[:success] = "Welcome to the Sample App!" 
     redirect_to @user 

    else 
     render 'new' 
    end 
    end 

    private 

    def user_params 
     params.require(:user).permit(:name, :email, :password, 
            :password_confirmation) 
    end 
end 

視圖/用戶/ new.html.erb

<%= form_for(@user)do | f | %> <%=渲染的共享/ 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> 

之前提出這個問題,可敬的計算器社區我尋找的答案在下面的鏈接: -

http://railscasts.com/episodes/250-authentication-from-scratch

First argument in form cannot contain nil or be empty Hartl's Rails 4 Tutorial

In Ruby on Rails Restful Authentication, UsersController#new, a @user = User.new is used. Is it actually needed?

謝謝你的時間。

回答

1

在線路發生

def new 
    @user = User.new 
end 

是什麼,Rails是創建一個名爲@user的實例變量(紅寶石使用實例變量@號),並指定一個新的User模型。這可能是大部分時間User模型

app/models/user.rb

,然後把它傳遞給你的看法#app/vies/users/new.html.erb

記住,初始化一個新的User對象,並分配到@user不一樣的分配nil價值的@user

然後是你的第二個問題,爲什麼它給了一個錯誤,當你排除是故意的。

所以背後的原因是,

當你說了@user = User.new並通過@user變量form_helper軌道。 (<%= form_for(@user) do |f| %>),所以form_helper自動劑量的一些東西給你,

如果你的網頁的HTML源代碼它會像

<form action="/users" id="new_user" method="post"> </form>

這意味着軌道形成助手是創建routes,後方法(post)等等。從你的線路<%= form_for(@user) do |f| %>。正如你現在可能已經明白,如果你只是通過'無via @user = nil , rails form_helper`不能做所有處理的東西,這就是爲什麼你會得到上述錯誤。

閱讀更多關於form helpers,HTH

+0

爲了更深入的理解,閱讀[form helpers](http://guides.rubyonrails.org/form_helpers.html)推薦sameera207是必須的。 – 2014-09-22 09:22:05

0

當你鍵入

@user = User.new

您與空字段創建模型的對象的用戶。這個變量是實例變量的這個對象,你可以訪問到它在你看來,你在看你的表單中使用它的表單字段

form_for(@user) 

字段是指定該變量的領域,但變量不能是零。如果您沒有變量@user,則可以使用任何其他變量並通過符號進行設置。 爲的form_for必須是實例變量,那麼變量(以@開始),或在.erb文件中指定

當您提交表單,您發送散列結果,其中變量的哈希與例如場 PARAMS {"utf8"=>"✓", "authenticity_token"=>"xxx=", "user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Create user"}

相關問題