2016-05-03 113 views
0

我試圖使用text_field窗體幫助器,但它不工作。這裏是我的形式Ruby on Rails窗體與可選字段

<%= form_for @score do |f| %> 
     <%= f.hidden_field :site_id %> 
     <%= f.select(:value, (1..10).to_a) %> 
     <%= f.text_field :response %>  
     <%= f.submit "Submit" %> 
<% end %> 

當我運行這個地方,我得到一個NoMethodError爲:responseResponse是我剛剛添加的score的屬性,所以問題可能在於此。

這是我的score_controller看起來像此刻

def create 
    @score = Score.create(score_params) 
    respond_with @score 
    end 

    def new 
    @score = Score.new(site: Site.find(params['site_id'])) 
    end 

    private 

    def score_params 
    params.require(:score).permit(:value, :response, :site_id) 
    end 

現在response不會是一個必填字段,用戶可以離開響應空白,如果他們想。或者至少這就是我想要的那樣。我是新來的鐵軌;這是我第一個使用它的項目。

感謝

編輯:這是我的成績表,用錯誤一起

create_table "scores", force: :cascade do |t| 
    t.integer "value",  null: false 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "site_id" 
    t.string "response" 
    end 

錯誤:

NoMethodError at /scores/new 
undefined method `response' for #<Score:0x007ff293567790> 
Did you mean? respond_to? 

EDIT2:創建在軌臺新的得分

s = Score.new 
=> #<Score:0x007fbec9001448 id: nil, value: nil, created_at: nil, updated_at: nil, site_id: nil, response: nil> 

Edit3 :@score from new action

[1] pry(#<ScoresController>)> @score.inspect 
=> "#<Score id: nil, value: nil, created_at: nil, updated_at: nil, site_id: 130>" 
[2] pry(#<ScoresController>)> 
+0

你確定'response'是'score'的''屬性?你能用分數表模式更新問題嗎? – Pavan

+0

您是否運行遷移?耙db:遷移? – Ursus

+0

我在分數表中添加了我的分數表 – Spance

回答

1

大概,rails會捕獲自己的響應對象,試試重命名它吧。 response_score

<%= form_for @score do |f| %> 
     <%= f.hidden_field :site_id %> 
     <%= f.select(:value, (1..10).to_a) %> 
     <%= f.text_field :response_score %> 
     <%= f.submit "Submit" %> 
<% end %> 

控制器:

def create 
    @score = Score.create(score_params.merge(response: params[:score][:response_score])) 
    respond_with @score 
    end 

    private 

    def score_params 
    params.require(:score).permit(:value, :site_id) 
    end 
1

你提到你剛剛加入:response,但對於scores表遷移顯示:response沒有額外的遷移。

new的返回值還表明該對象中沒有response,所以進一步指示response列從未實際創建。

鑑於您已經針對scores表遷移顯示了什麼,它看起來像您有一個遷移定義問題。添加一個新的數據庫列的正確方法是創建一個後續遷移,像這樣:

rails generate migration AddResponseToScores 

一旦你做到了這一點,你應該在DB新的遷移文件/遷移。編輯這個文件,像這樣:

class AddResponseToScores < ActiveRecord::Migration 
    def change 
    change_table :scores do |t| 
     t.string :response, limit: 1000, null: true 
    end 
    end 
end 

注意,我添加了limit預選賽(允許你限制列大小),並取得了null預選賽明確,這有助於自我文件代碼的意圖。我發現如果你正在構建一個「真正的」應用程序,這些對於維護者來說就變得很重要。但是,如果您認爲合適,您可以自由地忽略它們。

一旦編輯完成後,您可以運行遷移,就像這樣:

rake db:migrate 

如果成功,我也運行回滾方法,然後再次遷移,只是爲了確保沒有任何問題在部署問題的情況下回滾。您可以使用以下命令回滾您的遷移:

rake db:rollback 

應該確保正確創建:response列。

像這樣的遷移文件允許您在項目的生命週期中對數據庫模式進行增量更改。使用遷移添加或刪除列,更改列屬性(名稱,可爲空,大小等),添加或刪除索引,甚至添加或刪除表。你通常至少會有一些這樣的,如果你有一個更大的項目,可能會有很多。