Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails未定义的方法`model_name';用于更新共享类实例的窗体?_Ruby On Rails_Forms_Simple Form - Fatal编程技术网

Ruby on rails Rails未定义的方法`model_name';用于更新共享类实例的窗体?

Ruby on rails Rails未定义的方法`model_name';用于更新共享类实例的窗体?,ruby-on-rails,forms,simple-form,Ruby On Rails,Forms,Simple Form,类AccountWebhookConfigurations只保存了Webhook配置,但我们也添加了一个Mailhook特性,因此我们使用同一个类来存储新的首选项(现在不要介意进行必要的重构) 表单应通过新的AccountMailhookConfigurations控制器更新AccountWebhookConfiguration的实例。 类别: # frozen_string_literal: true class AccountWebhookConfiguration < Applic

AccountWebhookConfigurations
只保存了Webhook配置,但我们也添加了一个Mailhook特性,因此我们使用同一个类来存储新的首选项(现在不要介意进行必要的重构)

表单应通过新的
AccountMailhookConfigurations
控制器更新
AccountWebhookConfiguration
的实例。

类别:

# frozen_string_literal: true

class AccountWebhookConfiguration < ApplicationRecord
  self.ignored_columns = %i(endpoint)

  WEBHOOK_SUBSCRIBABLE_EVENTS = %w(subscription.update
                                   invoice.paid
                                   invoice.unpaid
                                   invoice.dunning
                                   invoice.update).freeze

  MAILHOOK_SUBSCRIBABLE_EVENTS = %w(subscription.authorized
                                    subscription.cancelled
                                    invoice.unpaid).freeze

  store_accessor :custom_settings, :subscribed_events, :mailhook_subscribed_events

  include Formeable
  form_to_array :subscribed_events
  form_to_array :mailhook_subscribed_events

  include Nullifyable
  nullify :endpoint, :endpoint_ciphertext
  nullify :mailhook_endpoint, :mailhook_endpoint_ciphertext

  encrypts :endpoint
  encrypts :mailhook_endpoint

  belongs_to :account

  validates :endpoint, http_url: { allow_blank: true }
  validates :endpoint, presence: true, if: :subscribed_events?

  validates :mailhook_endpoint, http_url: { allow_blank: true }
  validates :mailhook_endpoint, presence: true, if: :mailhook_subscribed_events?

  private

  def subscribed_events?
    subscribed_events.present?
  end

  def mailhook_subscribed_events?
    mailhook_subscribed_events.present?
  end
end
表单使用的视图与AccountWebhookConfiguration表单不同,因此我为其设置了一个控制器:

    # frozen_string_literal: true

class Admin::AccountMailhookConfigurationsController < AdminController
  before_action :authenticate_admin!

  def index
    @mailhook_configuration = current_account.webhook_configuration ||
      current_account.build_webhook_configuration
  end

  def create
    @mailhook_configuration = current_account
      .build_webhook_configuration(mailhook_configuration_params)
    if @mailhook_configuration.save
      flash[:success] = "Configuración actualizada"
      redirect_to_forwarder_or(params[:forwarding_uri], admin_account_mailhook_configurations_path)
    else
      render :index
    end
  end

  def update
    @mailhook_configuration = current_account.webhook_configuration
    if @mailhook_configuration.update(mailhook_configuration_params)
      flash[:success] = "Configuración actualizada"
      redirect_to_forwarder_or(params[:forwarding_uri], admin_account_mailhook_configurations_path)
    else
      render :index
    end
  end

  private

  def mailhook_configuration_params
    params.require(:account_webhook_configuration)
      .permit(:mailhook_endpoint, mailhook_subscribed_events: [])
  end
end

我做错了什么?

@mailhook\u configuration
之后移动结束括号
]
,以便
url:
作为独立于
数组中的项目的参数传递。e、 g.
simple\u form\u for[:admin,@mailhook\u configuration],url:admin\u account\u mailhook\u configurations\u path,method::patch
@engineersmnky感谢您指出这一点。我现在得到一个缺少必需的“id”错误:没有路由匹配{:action=>“update”,:controller=>“admin/account\u mailhook\u configurations”},缺少必需的密钥:[:id]a
PATCH
PUT
路由需要id。您的问题是
build\u webhook\u configuration
将不会生成id,因为它只是一个“build”(坚持)。这通常会通过
POST
路由和
create
操作来处理。因此,您需要确定如何处理。我将
@mailhook\u配置
传递到表单
URL
,这似乎解决了问题。现在一切似乎都正常工作并保存。这也有意义吗?感谢您的帮助!除非
当前帐户,否则这将起作用。webhook\u配置
nil
,然后您将得到相同或不同的错误。最好的办法是处理这种情况。
    # frozen_string_literal: true

class Admin::AccountMailhookConfigurationsController < AdminController
  before_action :authenticate_admin!

  def index
    @mailhook_configuration = current_account.webhook_configuration ||
      current_account.build_webhook_configuration
  end

  def create
    @mailhook_configuration = current_account
      .build_webhook_configuration(mailhook_configuration_params)
    if @mailhook_configuration.save
      flash[:success] = "Configuración actualizada"
      redirect_to_forwarder_or(params[:forwarding_uri], admin_account_mailhook_configurations_path)
    else
      render :index
    end
  end

  def update
    @mailhook_configuration = current_account.webhook_configuration
    if @mailhook_configuration.update(mailhook_configuration_params)
      flash[:success] = "Configuración actualizada"
      redirect_to_forwarder_or(params[:forwarding_uri], admin_account_mailhook_configurations_path)
    else
      render :index
    end
  end

  private

  def mailhook_configuration_params
    params.require(:account_webhook_configuration)
      .permit(:mailhook_endpoint, mailhook_subscribed_events: [])
  end
end
<div class="card">
  <%= simple_form_for [:admin, @mailhook_configuration, url: admin_account_mailhook_configurations_path], method: :patch do |form| %>
    <%= hidden_field_tag :forwarding_uri, request.url %>
    <%= form.input :mailhook_endpoint %>
    <%= form.input :mailhook_subscribed_events,
        as: :check_boxes,
        collection: mailhook_subscribable_events_for_form,
        wrapper: :vertical_collection %>
    <%= form.submit "Actualizar configuración de notificaciones", class: "btn btn-primary" %>
  <% end %>
</div>
resources :account_mailhook_configurations, only: %i(index create update)