1

Shopify サイトで行っているカスタマイズの一環として、特定のメタフィールドのみを編集できるツールを作成しようとしています。

インデックス ページには、ユーザーがフォームを介して編集できるようにしたい特定のメタフィールドに関連付けられているさまざまなコレクション、製品、ページ、およびブログ記事を一覧表示します。

...私の人生では、見逃したものを見ることができません!! これを解決するための助けは大歓迎です:)

だから... 行きます!ユーザーが「編集」をクリックすると (そのコレクション、製品、ページ、またはブログ記事の特定のメタフィールドを編集するためのフォームに移動する必要があります)、ブラウザーに次のエラーが表示されます。

NoMethodError in Metafields#edit

Showing /Users/james/code/test-app/app/views/metafields/_form.html.erb where line #1 raised:

undefined method `shopify_api_metafield_path' for #<#<Class:0x007facf51992a0>:0x007facf520fec8>

Extracted source (around line #1):
1: <%= form_for(@metafield) do |f| %>

モデル「metafield.rb」は次のようになります。

class Metafield < ActiveRecord::Base
  attr_accessible :namespace, :key, :value, :value_type, :description, :id
end

コントローラー「metafields_controller.rb」には、次のメソッドが定義されています。

  # GET /metafields/1/edit
  def edit
    @metafield = ShopifyAPI::Metafield.find(params[:id])
  end

ファイル「/views/metafields/index.html.erb」は次のようになります。

<h1>Listing metafields</h1>

<table>
  <tr>
    <th>Namespace</th>
    <th>Key</th>
    <th>Value</th>
    <th>Value type</th>
    <th>Description</th>
    <th>Id</th>
    <th></th>
  </tr>

<% @metafields.each do |metafield| %>
  <tr>
    <td><%= metafield.namespace %></td>
    <td><%= metafield.key %></td>
    <td><%= metafield.value %></td>
    <td><%= metafield.value_type %></td>
    <td><%= metafield.description %></td>
    <td><%= metafield.id %></td>
    <td><%= link_to 'Edit', edit_metafield_path(metafield) %></td>
  </tr>
<% end %>
</table>

ファイル「/views/metafields/edit.html.erb」は次のようになります。

<h1>Editing metafield</h1>

<%= render 'form' %>

<%= link_to 'Back', metafields_path %>

ファイル「/views/metafields/_form.html.erb」は次のようになります (そのうちの 1 行目でエラーがスローされているようです...):

<%= form_for(@metafield) do |f| %>
  <% if @metafield.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@metafield.errors.count, "error") %> prohibited this metafield from being saved:</h2>

      <ul>
      <% @metafield.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :namespace %><br />
    <%= f.text_field :namespace %>
  </div>
  <div class="field">
    <%= f.label :key %><br />
    <%= f.text_field :key %>
  </div>
  <div class="field">
    <%= f.label :value %><br />
    <%= f.text_field :value %>
  </div>
  <div class="field">
    <%= f.label :value_type %><br />
    <%= f.text_field :value_type %>
  </div>
  <div class="field">
    <%= f.label :description %><br />
    <%= f.text_field :description %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

前もって感謝します!

4

1 に答える 1

0

_form.html.erb で行うように、ビュー パーシャルでフォームをネストするのは得策ではありません。

<%= form_for(@metafield) do |f| %>
  <% if @metafield.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@metafield.errors.count, "error") %> prohibited this metafield from being saved:</h2>

      <ul>
      <% @metafield.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

このヘルパーを使用してみることができます:

<%= error_messages_for 'metafield' %>

form_for()ヘルパーを使用する代わりに。

アップデート

ヘルパーを使用する場合form_for()は、メタフィールド モデルを次のように定義するのが正しいでしょう。

class ShopifyAPI::Metafield < ActiveRecord::Base
{
}

form_for()ヘルパーは、フォーム送信時にレンダリングされるビューへのパスを見つけようとするためです。このパスはshopify_api_metafield_path()、エラー メッセージから undefined メソッドであるヘルパーによって返されます。

ヘルパーに関してerror_messages_for()は、HTML フォーム タグに変換されず、HTML フォームをネストせずにビュー パーシャル内で使用できます。詳細はこちら

于 2013-04-06T06:11:40.173 に答える