Rails:2个型号,1个表。单独的表格+控制器。在活动记录验证错误表单后呈现错误的模型/错误

问题描述 投票:1回答:2

我有2个模型(passsubscription),2个控制器和2个表格。模型共享数据库表。

共享表是passes。要告诉记录是否是subscription,有一个列is_subscription。因此,我有以下为我的subscription模型:

      self.table_name = :passes
      default_scope { where(is_subscription: true) }
      validates :name, presence: true

请注意name上的验证。

subscription形式:

<%= form_for(@subscription, html: {class: "my-class"}) do |f| %>

它呈现:

<form class="form-horizontal" id="new_subscription" action="/subscriptions" accept-charset="UTF-8" method="post">
<input class="form-control" type="text" name="subscription[name]" id="subscription_name">
...

在控制器中:

  def show
  end

  def new
    @subscription = Subscription.new
  end

  def create
    @subscription = current_user.company.passes.new(subscription_params)
    if @subscription.save
      redirect_to subscription_path(@subscription), notice: "Yay"
    else
      render :new
    end
  end

一切都很好。但是如果我尝试创建一个新的订阅并从表单中省略name - 这会触发活动记录验证和错误。表单重新呈现,现在已更改:

<form class="form-horizontal" id="new_pass" action="/passes" accept-charset="UTF-8" method="post">
<input class="form-control" type="text" value="" name="pass[name]" id="pass_name">
...

我已经尝试设置as: "subscription"来修复除动作之外的所有内容。如果我设置action:,行动仍然被覆盖。

希望了解如何最好地处理这个问题。不幸的是,我没有能力改变表的位置(即使用单独的表)。

ruby-on-rails ruby activerecord erb form-for
2个回答
1
投票

我不知道为什么你在提交订阅时创建一个Pass(你说你有两个控制器,但看起来你只使用一个控制器(?))。

如果无法保存Pass,我只会设置一个Subscription对象:

def create
  @subscription = Pass.new(subscription_params)
  if @subscription.save
    redirect_to subscription_path(@subscription), notice: "Yay"
  else
    @subscription = Subscription.new(subscription_params)
    render :new
  end
end

这样您就可以订阅正在使用的变量。

编辑:另外,检查activerecord对Single Table Inheritance的支持,它可以帮助你清理模型https://edgeguides.rubyonrails.org/association_basics.html#single-table-inheritance


1
投票

你可以使用form_tag而不是form_for。前者并不关心正在使用的模型对象 - 实际上你甚至都没有将它传入。这将要求你使用通用的text_field_tag等助手而不是你现在可能正在使用的form.text_field :foo

但它可以让你支持这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.