【问题标题】:Rails - Displaying Foreign Key References in a formRails - 在表单中显示外键引用
【发布时间】:2013-05-26 18:26:28
【问题描述】:

我正在用两个模型做一个简单的练习。运动和团队,定义为

rails g 脚手架运动名称:整数 rails g 脚手架团队名称:整数粉丝:整数运动:参考

(注意:我使用脚手架的原因是快速制作原型,以便我可以学习/实验我还不熟悉的部分)

问题是我的“运动”(即外键引用)显示如下

所以它有那个奇怪的#<blahl blah> 符号...

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

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

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
     <div class="field">
    <%= f.label :fans %><br />
    <%= f.number_field :fans %>
  </div>
  <div class="field">
    <%= f.label :sport %><br />
    <%= f.text_field :sport %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

我尝试将这一行更改为@team.sport.name,但会导致错误undefined method 'Ice Hockey' for #&lt;Team:0x3e7e040&gt;...有什么想法可以从这里正确显示名称吗??

【问题讨论】:

    标签: ruby-on-rails ruby forms views


    【解决方案1】:

    您正在使用 text_field 来引用现有对象,这里更适合使用带有 Sports 作为选项的 select

    这是必须改变的地方:

    <div class="field">
      <%= f.label :sport %><br />
      <%= f.text_field :sport %>
    </div>
    

    收件人:

    <div class="field">
      <%= f.label :sport %><br />
      <%= f.select :sport_id, options_for_select(Sport.all.map{|s|[s.name, s.id]}) %>
    </div>
    

    f.select 将在 HTML 中生成一个选择框,这些选项将显示您数据库中的所有运动。

    一些关于它的文档

    更简洁的方法是在您的控制器中设置一个变量@sports,然后在您的视图中调用它:

    # in controller
    def edit
      @sports = Sport.scoped
      #...
    
    # in edit view
    <div class="field">
      <%= f.label :sport %><br />
      <%= f.select :sport_id, options_for_select(@sports.map{ |s| [s.name, s.id] }) %>
    </div>
    

    附加信息:如果你想“预选”一个选项,你必须将它作为options_for_select helper 的第二个参数传递:

    options_for_select(@sports.map{ |s| [s.name, s.id] }, params[:sport_id])
    # this will select by default the option that matches the value of params[:sport_id]
    

    【讨论】:

    • 谢谢@MrYoshiji。我正在尝试您的第一个建议,并且值正确显示在选择框中。但是,我在尝试保存时收到ActiveModel::MassAssignmentSecurity::Error,上面写着Can't mass-assign protected attributes: sport_id
    • 我通过将:sport_id 添加到我的attr_accessors 来为team_controller 工作。这是正确的方法吗?另外,我尝试了第二种方法,它有效,但我不明白为什么。 Sport.scoped 是做什么的?为什么只在edit 方法中需要它?例如,new 方法也共享相同的_form.html.erb 视图,但我没有在其中调用@sports = Sport.scoped,但它仍然有效......感谢您的任何见解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多