所以之前有人问过这个问题,但没有令人满意的答案。
考虑两个模型,User
, 和 Subscription
关联如下:
class User < ActiveRecord::Base
has_one :subscription, dependent: :destroy
end
class Subscription < ActiveRecord::Base
belongs_to :user
end
在 SubscriptionsController 中,我有一个看起来像这样的新操作
def new
user = User.find(params[:user_id])
@subscription = user.build_subscription
end
鉴于用户记录已经存在订阅,我面临以下问题:
user.build_subscription
是 破坏性 , 意思就是 访问 new
action 实际上会破坏关联,从而丢失当前的订阅记录。现在,我可以简单地检查订阅的存在并像这样重定向:
def new
user = User.find(params[:user_id])
if user.subscription.present?
redirect_to root_path
else
@subscription = user.build_subscription
end
end
但这似乎并不那么优雅。
这是我的问题
不应该只是建立一个 暂定协会记录不具破坏性 ?
这不违反 RESTful 路由吗,因为
new
使用 GET 请求访问,不应该 修改记录?或者也许我做错了什么。我应该以不同的方式建立记录吗?也许通过
Subscription.new(user_id: user.id)
?似乎没有多大意义。非常感谢您解释为什么以这种方式实现以及您将如何处理此问题。
谢谢!
最佳答案
我今天遇到了这个问题,我同意当你调用 build 时从数据库中删除一些东西是一个非常意外的结果(导致我们有错误的数据)。正如您所建议的,您只需执行 Subscription.new(user: user) 即可轻松解决问题。我个人认为它的可读性并不比 user.build_subscription 低得多。
关于ruby-on-rails - Rails has_one build_association 在保存前删除记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20945853/