我有2个模型(pass
和subscription
),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:
,行动仍然被覆盖。
希望了解如何最好地处理这个问题。不幸的是,我没有能力改变表的位置(即使用单独的表)。
我不知道为什么你在提交订阅时创建一个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
你可以使用form_tag
而不是form_for
。前者并不关心正在使用的模型对象 - 实际上你甚至都没有将它传入。这将要求你使用通用的text_field_tag
等助手而不是你现在可能正在使用的form.text_field :foo
。
但它可以让你支持这个问题。