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]aPATCH
或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)