使用ruby on rails通过表单编辑Shopify元字段数据没有方法错误



作为我正在为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| %>

模型"元字段"。Rb "看起来像这样:

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

控制器metafields_controller。

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

文件"/views/metaffields/index.html。动词"看起来像这样:

<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/metaffields/edit.html。动词"看起来像这样:

<h1>Editing metafield</h1>
<%= render 'form' %>
<%= link_to 'Back', metafields_path %>

文件"/views/metaffields/_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 %>

提前感谢!

像在_form.html.erb中那样在view partial中嵌套表单不是一个好主意。

<%= 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() helper。

如果您希望使用form_for() helper,那么这样定义您的Metafield模型将是正确的:

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

因为form_for()助手试图找出一个路径的视图,将呈现在表单提交。此路径是由shopify_api_metafield_path() helper返回的,它是错误消息中的未定义方法。

关于error_messages_for() helper,它不会被翻译成HTML表单标签,可以在视图部分中使用,而不需要嵌套HTML表单。点击这里查看更多信息