ruby-on-rails - 在rails中存储另一个表格形式的值
问题描述
我有一个用户表和游戏表。游戏表有 user_id。我想要的帮助是如何从游戏表单(用户表中的一个字段)更改/输入出生城市的值。我正在使用 try() 方法以游戏形式从用户表中显示出生城市的值。
用户.rb
has_many :games, dependent: :destroy
游戏.rb
belongs_to :user
_form.html.erb(游戏)
<div class="custom-hidden field">
<%= form.label :user_id %>
<%= form.number_field :user_id %>
</div>
<div class="field">
<%= form.label :city_of_birth, "User City of Birth" %>
<%= form.text_field :city_of_birth, :value => @user.try(:city_of_birth) %>
</div>
<div class="field">
<%= form.label :game_name %>
<%= form.text_field :game_name %>
</div>
解决方案
我将假设此表单旨在创建 a Game
, which来回答这个问题belongs_to :user
,因为user_id
表单中有 a ,并且那user.city_of_birth
是一个字符串。
传统的方法是使用accepts_nested_attributes_for
Rails 的特性。
https://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
但是,我强烈建议您考虑编写一个表单对象来处理此问题,以便将验证此混合模型表单的责任完全集中在一个地方。我建议使用像改革这样的宝石来简化这个过程。
# app/forms/games/new_game_form.rb
class Games::NewGameForm < Reform::Form
property :user_id, validates: { presence: true }
property :city_of_birth, virtual: true, validates: { presence: true }
property :game_name, validates: { presence: true }
def save
Game.transaction do
user.update!(city_of_birth: city_of_birth)
Game.create(user: user, game_name: game_name)
end
def user
@user ||= User.find(user_id)
end
end
然后可以使用此表单对象代替Game
实例。
# GamesController
def new
@form = Games::NewGameForm.new(Game.new)
end
<!-- new.html.erb -->
<%= form_with @form, url: games_path, method: :post do |f| %>
<!-- your form fields -->
<% end %>
请注意,您接受表单中的 a 并阅读from似乎很奇怪。如果已经知道正在为谁创建游戏(可能是登录用户),那么接受表单中的 ID 是没有用的(并且存在安全风险) - 您可以简单地使用与设置.user_id
city_of_birth
@user
@user
@user
推荐阅读
- kubernetes - minikube 隧道命令在添加路由时显示错误
- javascript - 如何将 HTML Canvas 内容保存到 Google 存储
- continuous-integration - Testflight:Beta App Review 信息未保留在 Appstore connect 上(通过 Appcenter 分发)
- html - 大众单位、尺寸属性和媒体查询不起作用
- java - 为什么我的 gif 显示时滞后?(JFrame)
- c - 错误:在 '*' 标记结构之前需要 '{'(C 编程帮助)
- python - 如何在 Pygame 中以一定的容差检查某些屏幕颜色?
- vba - 使用预设字打印
- c - 如何将信号从父进程转发给子进程
- html - 悬停时将 div 推送到屏幕外