将其他表格中的值存储在rails中

时间:2019-04-15 16:09:38

标签: ruby-on-rails ruby

我有一个用户表和游戏表。游戏表具有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>

1 个答案:

答案 0 :(得分:0)

我将回答这个问题,假设此表单旨在创建一个Gamebelongs_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