首页 > 解决方案 > 在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>

标签: ruby-on-railsruby

解决方案


我将假设此表单旨在创建 a Game, which来回答这个问题belongs_to :user,因为user_id表单中有 a ,并且那user.city_of_birth是一个字符串。

传统的方法是使用accepts_nested_attributes_forRails 的特性。

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_idcity_of_birth@user@user@user


推荐阅读