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 %>

そして、Vendor テーブルの移行:

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)
4

3 に答える 3

3

form_for問題は、正しく使用してパラメーターを送信していないことです。form_tag、などを直接使用してtext_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オブジェクトをインスタンス化して、フォームが送信されたときにフォームを送信するコントローラー/アクションを認識していることを確認してください。

ラベルを使用してフィールドにラベルを付けたくない場合は、placeholder代わりに html5 属性を使用してフィールド ヒントを指定できます。

<%= f.text_field :name, placeholder: "Store Name" %>
于 2013-10-21T22:57:47.103 に答える
2

あなたの問題はここにあります:

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

strong params具体的には、Rails でparams を「require」する場合、基本的にはparams ハッシュが次のように構成されていることを期待します。

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

form_for @vendorこれは、Rails が params ハッシュに初期値を定義する方法であるため、new.html.erb ビューで使用する場合にのみ実現できます。アプリが行っていることは、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 %>
于 2013-10-23T09:48:55.613 に答える