2013-12-10 38 views
1

我搜索了並且沒有找到任何東西,所以我需要請你們幫忙。form_for未向數據庫提交字段

我有一個簡單的新窗體,應該從form_for中獲取兩個字段,然後將其發佈到數據庫中。問題在於它沒有。

我的示例數據庫只有兩個字段:姓名和SITE_ID

這裏是我的new.html.erb:

<%= form_for @kejsu do |f| %> 
<%= f.text_field :name %> 
<%= f.text_field :site_id %> 
<%= f.submit "Create" %> 
<% end %> 

這裏的控制器:

def new 
    @kejsu = Kejs.new 
end 

def create 
    @kejsu = Kejs.new(params[:kejsu]) 
    if @kejsu.save 
     redirect_to kejs_index_path 
    else 
     render "new" 
    end 
end 

命中率只有提交按鈕後插入時間戳。下面是從片斷軌服務器

Started POST "/cases" for 192.168.56.1 at 2013-12-10 23:11:03 +0000 
Processing by KejsyController#create as HTML 
    Parameters: {"utf8"=>"â",   "authenticity_token"=>"Sr2ssiwtRtk9pRT5VfuDFglsEmGnjzwVkRGGBSb2zhA=", "kejs"=> {"name"=>"aa", "site_id"=>"3"}, "commit"=>"Create"} 
    (0.1ms) begin transaction 
    SQL (5.1ms) INSERT INTO "kejs" ("created_at", "updated_at") VALUES (?, ?)  [["created_at", Tue, 10 Dec 2013 23:11:03 UTC +00:00], ["updated_at", Tue, 10 Dec 2013  23:11:03 UTC +00:00]] 
    (4.0ms) commit transaction 
Redirected to http://192.168.56.101:3000/cases 
Completed 302 Found in 14ms (ActiveRecord: 9.2ms) 

正如你可以看到這些字段作爲參數傳遞,但INSERT不會插入它們。

我試過用默認的寧靜路由,寫我自己的路線,它不工作任何方式。

作爲獎勵,我的路線:

get 'cases' => 'kejsy#index', as: :kejs_index 
    get 'cases/new' => 'kejsy#new', as: :new_kejs 
    post 'cases' => 'kejsy#create' 
+1

包含模型也是有幫助的。它看起來像你的行動正在接收參數正確的問題是符合Kejsu。new(params [:kejsu]) – amitamb

+0

我的模型非常空,只是通過rails g創建的標準聲明。 – toxicbeaver

回答

1

params[:kejsu]參考使用:kejsu,但params[:kejs]下存在的參數,所以你的價值回升nil

params的密鑰由類名傳遞給form_for對象的(即在這種情況下Kejs)確定,而不是由變量名稱(即@kejsu)。如果你仔細想想,這是有道理的,因爲變量名稱不是可用form_for,因爲@kejsu是通過的。

+0

這不是我正在尋找的直接答案,但是你指出了我要尋找的方向。在做了這個小改動之後,Rails用'ForbiddenAttributesError'錯誤尖叫了我,所以我做了一些搜索,出現了什麼是「強大的參數」。我不知道Rails 4(我正在使用它)改變了處理參數的行爲。但是要切中要害:我在'params'上使用了'require'和'permit',並且它像一個魅力一樣工作。我會將其作爲答案發布。 – toxicbeaver

+0

:-)我打算說一些有關強參數的東西,但是你說你沒有得到任何錯誤,所以我開始尋找其他地方。 –

+0

我對rails非常陌生,但我仍然不太明白爲什麼我應該使用':kejs'而不是':kejsu'。閱讀教程我認爲''params [:kejsu]'是我引用的對象在<%= form_for @kejsu do | f | %>',但我想我錯了。 – toxicbeaver

0

調試,您可以使用您的render :text => params.inspect控制器內,所以我會改變這樣的

def create 
    render :text => params.inspect 
end 

我的代碼現在去,並請提交您的形式。什麼是你的參數中的關鍵名稱?是kejsu還是kejs

如果其kejs比你可以憑藉雄厚的參數更改您的代碼

def create 
    @kejsu = Kejs.new(params[:kejs]) 

    if @kejsu.save 
    redirect_to kejs_index_path 
    else 
    render "new" 
    end 
end 
0

如所承諾的,答曰:

def create 
    @kejsu = Kejs.new(kejs_params) 

    if @kejsu.save 
     redirect_to kejs_index_path 
    else 
     render "new" 
    end 
end 

def kejs_params 
    params.require(:kejs).permit(:name, :site_id) 
end 

我需要改變我處理傳遞參數的方式通過創建允許給定字段的新方法的形式。現在它像它應該的那樣工作。

感謝您的所有提示。