将另一个表中的数据显示为一种形式 - rails

Posted

技术标签:

【中文标题】将另一个表中的数据显示为一种形式 - rails【英文标题】:Show data from another table into one form - rails 【发布时间】:2016-04-28 17:20:07 【问题描述】:

我已经创建了 2 个表

平台:

  def change
    create_table :platforms do |t|
      t.string :name

      t.timestamps null: false
    end
  end

游戏:

  def change
    create_table :games do |t|
      t.string :title
      t.text :description
      t.string :image_url
      t.decimal :price
      t.integer :platform_id

      t.timestamps null: false
    end

    add_index :games, :platform_id
  end

然后这是我的游戏中的 _form.html.erb

<%= form_for(@game) do |f| %>
  <% if @game.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@game.errors.count, "error") %> prohibited this game from being saved:</h2>

      <ul>
      <% @game.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :description %><br>
    <%= f.text_area :description %>
  </div>
  <div class="field">
    <%= f.label :image_url %><br>
    <%= f.text_field :image_url %>
  </div>
  <div class="field">
    <%= f.label :price %><br>
    <%= f.text_field :price %>
  </div>


  <div class="field">
    <%= f.label :platform %><br>
    <div>
      <%= collection_select( :invoice, :platform_id, Platform.all, :id, :name, , :multiple => false) %>
    </div>

  </div>


  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

如果我创建新游戏并从选择输入中选择了 PlayStation,当我点击提交时,将显示 Games 表中的字段,例如 title、description、price、image_url 我想显示我之前选择的平台名称,例如 PlayStation 所以我添加了

 <p>
  <strong>Platform:</strong>
  <%= @platform.name %>
 </p>

从游戏中显示.html.erb,但当我尝试时,我得到错误

nil:NilClass 的未定义方法“名称”

我错过了什么吗? 我在这里尝试了一些解决方案,但仍然错误 谢谢

【问题讨论】:

您是否在控制器中设置了@platform 实例变量? 什么是@platform?另外,您确定创建游戏时platform_id 不是nil?因为collection_select 是错误的。 @Pavan 之前我已经制作了 3 个数据平台。即 PC、PlayStation 和 Xbox。我写 collection_select 有什么错误? 检查platform_id表中platform_id的值并告诉我。 @pavan btw 我想我已经解决了:D 我已经将 collection_select 更改为 &lt;%= collection_select( :game, :platform_id, Platform.all, :id, :name, :multiple =&gt; false) %&gt; 然后我将 &lt;%= @platform.name %&gt; 更改为 &lt;%= @game.platform.name %&gt; 我尝试添加游戏然后我选择平台和所有数据都可以显示。我不知道我所做的collection_select 是否正确,但感谢您提供线索:D 【参考方案1】:

您可以通过 @game 变量中的 belongs_to 关联来检索它。

<p>
  <strong>Platform:</strong>
  <%= @game.platform.name %>
</p>

【讨论】:

仍然得到 nil:NilClass 的未定义方法 `name' 关联设置是否正确。提交表单时的日志消息是什么。 检查 strong_parameters 没有将 platform_id 参数列入黑名单。还要检查 rails 控制台中的游戏记录,以确保您确实正确保存了它。在我看来,collection_select 有点可疑 请向我们展示您的 controllers/games_controller.rb 和 models/game.rb。可能他们有什么问题。可能是模型之间的错误关系或 strong_parameters 做得不好。

以上是关于将另一个表中的数据显示为一种形式 - rails的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 从一种形式保存在两个表中

无法保存其他表中的数据。 Ruby on Rails 5

Rails 5 调度程序每天更新一次数据库

将另一个表中的选定列插入表中[重复]

Rails - 当用户单击提交按钮时如何更新表中的数据

可以将另一个表作为表中的一行引用吗?