如何使用来自不同对象的属性填充表单?

时间:2016-08-11 00:10:58

标签: ruby-on-rails ruby model-view-controller

如何在 duels / _dueler_fields 下的current_user中显示text_field :name的名称?

DuelsController

def new
  @duel = Duel.new
  @duel.duelers << Dueler.new(user: current_user)
end

rails c

pry(main)> Duel.last
 id: 20,
 consequence: "Run naked lap",
pry(main)> Dueler.last
 id: 34,
 user_id: 78,
 challenge_id: 295,
 duel_id: 20,
pry(main)> User.find(78)
 id: 78,
 name: "Anthony" # How to get User's name?

决斗/ _form

<%= simple_form_for(@duel) do |f| %>
  <%= f.fields_for :duelers do |dueler| %>
    <%= render 'dueler_fields', :f => dueler %>
  <% end %>

  The loser(s) will <%= f.text_field :consequence, placeholder: "Enter Consequence" %>.

  <%= f.submit %>
<% end %>

决斗/ _dueler_fields

<%= f.number_field :user_id, placeholder: "Enter User" %>. # This will give the correct id number, but I tried setting it to text_field :name. That didn't work

1 个答案:

答案 0 :(得分:1)

根据您的描述,看起来您想要的并不是您正在做的事情;使用fields_for将允许您创建关联模型的新实例,但似乎您只想将其链接到现有实例。

如果是这种情况,请尝试以下方法:

<强>决斗/ _form

<%= simple_form_for(@duel) do |f| %>
  <%= f.association :user, input_html: {value: current_user.id} %>

  The loser(s) will <%= f.input :consequence, placeholder: "Enter Consequence" %>.

  <%= f.submit %>
<% end %>

使用f.association应自动生成包含所有可用用户的下拉列表,并使用相应模型的to_s方法呈现其对象(在本例中为User

正因为如此,您还需要确保User模型中有一种方法可以将to_s覆盖为合理的方式,例如

<强>模型/用户

def to_s
  name
end

或者,如果您只想输入显示当前用户名称的静态文本字段并且不允许对其进行编辑,则可以执行以下操作:

<强>决斗/ _form

<%= simple_form_for(@duel) do |f| %>
  <%= f.input :user_id, as: :hidden, input_html: {value: current_user.id} %>
  <label>User</label><p><%= current_user.name %></p>

  The loser(s) will <%= f.input :consequence, placeholder: "Enter Consequence" %>.

  <%= f.submit %>
<% end %>