2013-10-21 79 views
1

我有這些相關的控制器型號:缺少所需參數 - 軌道

class VendorsController < ApplicationController 

    def vendor_params 
     params.require(:vendor).permit(:id, :name, :address, :image, :latitude, :longitude) 
    end 

    def create 
     vendor = Vendor.create(vendor_params) 
     flash[:success] = "Vendor Created" 
     redirect_to vendors_mgmt_path 
    end 

end 

當我嘗試創建一個新的供應商對象,我得到以下錯誤:

Required parameter missing: vendor 

這裏是我的表格:

<%= form_tag({controller: "vendors", action: "create"}, method: "post", multipart: true) do %> 
<%= text_field_tag :name, "Store Name" %> 
<%= text_field_tag :address, "Store Address" %> 
<%= file_field_tag :image %> 
<%= submit_tag "Save", class: "btn btn-success" %> 
<% end %> 

而且我對賣方表遷移:

class CreateVendors < ActiveRecord::Migration 
    def change 
    create_table :vendors do |t| 

    t.string :name 
    t.string :address 
    t.float :latitude 
    t.float :longitude 
    t.string :image 

    t.timestamps 
    end 
    end 
end 

有沒有人看到一個線索,爲什麼我可能會得到這個錯誤?我不明白如何:vendor本身是一個參數...任何幫助非常感謝。提前致謝!

這是我更新的形式:

<%= form_for @vendor, multipart: true do |f| %> 
<%= f.text_field :name, "Store Name" %> 
<%= f.text_field :address, "Store Address" %> 
<%= f.file_field :image %> 
<%= f.submit "Save", class: "btn btn-success" %> 
<% end %> 

我雖然沒有得到這個錯誤:

undefined method `merge' for "Store Name":String 

從我已經做了搜索,這聽起來像鐵軌方法merge只有作品在哈希上,而不是字符串。我不知道爲什麼它會試圖合併這個,除非我的表單沒有正確創建一個散列?

我的新動作:

def new 
    @vendors = Vendor.all 
    @vendor = Vendor.new 
end 

服務器日誌

Started GET "/vendors/new" for 127.0.0.1 at 2013-10-23 08:04:04 -0700 
Processing by VendorsController#new as HTML 
    Vendor Load (0.3ms) SELECT "vendors".* FROM "vendors" 
Rendered vendors/new.html.erb within layouts/application (2.0ms) 
Completed 500 Internal Server Error in 18ms 

ActionView::Template::Error (undefined method `merge' for "Store Name":String): 
    5: <h4>New Vendor Form</h4> 
    6: 
    7: <%= form_for @vendor, multipart: true do |f| %> 
    8: <%= f.text_field :name, "Store Name" %> 
    9: <%= f.text_field :address, "Store Address" %> 
    10: <%= f.file_field :image %> 
    11: <%= f.submit "Save", class: "btn btn-success" %> 
    app/views/vendors/new.html.erb:8:in `block in _app_views_vendors_new_html_erb__2593637676836103609_2161482240' 
    app/views/vendors/new.html.erb:7:in `_app_views_vendors_new_html_erb__2593637676836103609_2161482240' 


    Rendered /Users/******/.rvm/gems/ruby-2.0.0-p195/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.8ms) 
    Rendered /Users/******/.rvm/gems/ruby-2.0.0-p195/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.4ms) 
    Rendered /Users/******/.rvm/gems/ruby-2.0.0-p195/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (11.9ms) 

回答

2

你的問題是在這裏:

<%= form_tag({controller: "vendors", action: "create"}, method: "post", multipart: true) do %> 

具體而言,當您在Rails中使用strong params「需要」參數時,基本上預計params hash的結構如下:

params{"vendor" => {"name":sdfadsf, "address": 23423}} 

這隻有在您的new.html.erb視圖中使用form_for @vendor才能實現,因爲這是Rails如何將params散列的初始值定義的。你的應用程序正在做的是設置params哈希表是這樣的:

params{"name": 234234, "address: 234324} 

解決方案

在你new.html.erb形式,只要使用此代碼:

<%= form_for @vendor, method: "post", multipart: true) do %> 
    <%= text_field_tag :name, "Store Name" %> 
    <%= text_field_tag :address, "Store Address" %> 
    <%= file_field_tag :image %> 
    <%= submit_tag "Save", class: "btn btn-success" %> 
<% end %> 
+0

這是一個很好的答案。很高興知道有關強大的參數和形式。你會檢查我現在被拋出的錯誤嗎?我已經用它更新了我的問題。 – settheline

+0

沒問題!有關於該錯誤的更多信息?我看不到任何你稱之爲「合併」命令的地方,並且很高興看到任何其他信息可以提供:) –

+0

謝謝!更新錯誤的服務器日誌。 – settheline

0

除非我已經錯過了一些東西不立即obvious--

params.require(:vendor) 

您指定參數必須包含:供應商。請刪除此條款,例如

def vendor_params 
    params.permit(:id, :name, :address, :image, :latitude, :longitude) 
end 

如果嵌套了您的參數:vendor下方則.require(:vendor)纔有意義。看看你的開發日誌,看看傳入的參數(如果你還有問題,可以在這裏分享)。

+0

我原本以這種方式設置了我的vendor_params,但如果您不需要(:vendor),則會遇到問題。我的理解是:除非你需要(:vendor),否則在rails表單中默認存在隱藏的字段(如authenticity_token)。從我問這個星期的問題:[鏈接](http://stackoverflow.com/questions/19486042/rails-not-updating-attribute) – settheline

3

問題是你沒有正確使用form_for發送你的參數。您直接使用form_tagtext_field_tag等,您應該只在特定情況下執行此操作,因爲這會繞過Rails的許多內置功能。您不需要指定值,因爲它會自動填充@vendor中的內容。您可以添加標籤來每個字段標籤如下例所示:

<%= form_for @vendor, html: {multipart: true} do |f| %> 
    <%= f.label :name, "Store Name" %> 
    <%= f.text_field :name %> 
    <%= f.label :address, "Store Address" %> 
    <%= f.text_field :address %> 
    <%= f.file_field :image %> 
    <%= f.submit "Save", class: "btn btn-success" %> 
<% end %> 

在你new行動確保你實例化一個空Vendor對象,因此它知道什麼控制器/動作發送表單關閉時,它被提交。

如果你不想使用標籤來標記字段,你可以使用HTML5 placeholder屬性給一個字段,而不是提示:

<%= f.text_field :name, placeholder: "Store Name" %> 
+0

我看,這是有道理的。我如上所述更新了我的表單。任何想法,爲什麼我得到一個'未定義的方法'合併'存儲名稱':String'錯誤? – settheline

+0

哦,我傻了;)'f.text_field'沒有「value」參數,它從窗體的對象中獲取值。我已經更新了我的答案。我不認爲你需要一個新的問題:p – nzifnab