我有一个用户表和游戏表。游戏表具有user_id。我想要的帮助是如何从游戏表格(用户表中的字段)更改/输入出生城市的值。我正在使用try()方法从游戏形式的用户表中显示出生城市的值。
user.rb
has_many :games, dependent: :destroy
game.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>
答案 0 :(得分:0)
我将回答这个问题,假设此表单旨在创建一个Game
,belongs_to :user
,因为表单中有一个user_id
,而那个{{ 1}}是一个字符串。
传统的方式是使用Rails的user.city_of_birth
功能。
https://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
但是,我强烈建议您考虑编写一个 form对象来处理此问题,以便使验证这种混合模型形式的责任明确地归于一个地点。我建议使用Reform之类的宝石来简化此过程。
accepts_nested_attributes_for
然后可以使用此表单对象代替# 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 %>
,但同时也从user_id
中读取city_of_birth
,这看起来很奇怪。如果已经知道要为其创建游戏的@user
(也许是登录用户),则接受表单中的ID是没有用的(并且存在安全风险)-您可以使用与用于设置@user
。