ruby-on-rails - 创建另一个模型时如何更新现有模型?
问题描述
我有两个模型,用户和产品。产品属于用户,用户有很多产品。
创建产品时,我还想更新用户模型中的多个字段。我已经使用 Ruby 进行了 2 年的开发,但在涉及到这些东西时仍然不能完全理解表单。我还在permitted: false
。现在我知道,例如,如果我正在创建一段时间,我user
也会创建一个,但在这种情况下,我只想更新一个已经存在的记录。product
@product.user.build
我也意识到我可能无法打电话f.fields_for :user
,因为@product
还不知道用户。在我的脑海中,我相信我应该能够将附加信息传递params
给表单,current_user
在product#create
操作中获取,然后通过调用 user.xml 手动更新属性update_attributes
。
产品.rb
accepts_nested_attributes_for :user
产品控制器
def new
@product = Product.new
end
params.require(:product).permit(:product_name, user_attributes: [:phone_number, :email_address])
产品视图
form_for @product do |f|
f.fields_for :user do |c|
c.text_field :phone_number
c.text_field :email_address
f.text_field :product_name
end
解决方案
我也意识到我可能无法调用 f.fields_for :user 因为@product 还不知道用户。
您可以将属性分配给 @product 而不保存它。
def new
@product = Product.new(
user: current_user
)
end
现在@product.user
工作。
推荐阅读
- reactjs - 如何在使用 Enzyme 测试 React 组件时设置状态
- r - 在 dplyr 中创建具有动态位置数的滞后/领先变量
- spring-boot - 如何遍历 Web 应用程序中的文件
- apache-zeppelin - 启动 Zeppelin 失败
- c++ - 在 Linux 中存储语言环境名称的缓冲区大小应该是多少?
- javascript - CentOS 7 中 curl 请求得到的响应不同
- apache-kafka - Kafka 自定义状态存储未更新
- azure - 从 azure 中的单独项目添加管道触发器
- hyperledger-fabric - Hyperledger configtx.yaml 应用程序与通道部分
- wkwebview - 有没有办法让 WKWebview 成为 firstResponder?