0

所以我有以下有效的erb:

<ul class="list-group">
  <%- @user_skills.each do |user_skill| %>
    <li class="list-group-item"><%= user_skill.skill.name %></li>
  <% end %>
</ul>

<%= semantic_form_for current_user.user_skills.new do |f| %>
  <%= f.inputs %>
  <%= f.actions  %>
<% end %>

在我的控制器中,我有一个@user_skills = current_user.user_skills. 一旦我交换了两个块:

<%= semantic_form_for current_user.user_skills.new do |f| %>
  <%= f.inputs %>
  <%= f.actions  %>
<% end %>

<ul class="list-group">
  <%- @user_skills.each do |user_skill| %>
    <li class="list-group-item"><%= user_skill.skill.name %></li>
  <% end %>
</ul>

它会引发如下错误:undefined methodname' for nil:NilClass`。所以我猜测表单构建器以某种方式覆盖了 ul 块内的 user_skill 。但是为什么以及如何解决这个问题?这似乎不是一个格式问题,因为我还使用了本机表单生成器。

更新:所以我发现@user_skills 数组实际上包含刚刚创建的 user_skill,它没有被持久化并且没有#skill_idor #skill.name!如果我UserSkill.new在表格的开头这样做,那么@user_skills 数组就可以了。也许在 activerecord 中有一个缓存层,它会自动将刚刚创建的对象包含到查询中。或者这是一个错误?

4

1 回答 1

0

该调用为 的关联current_user.user_skills.new添加了一个空白。由于只是对 的引用,因此在初始化新的 user_skill 记录后进行迭代时,空白实例将包含在无序列表中。user_skillhas_manycurrent_user@user_skillscurrent_user.user_skills

你最好简单地user_skill在表单中初始化一个新的:

<%= semantic_form_for UserSkill.new do |f| %>
  <%= f.inputs %>
  <%= f.actions  %>
<% end %> 

然后,在您的创建操作中UserSkillsController,将user_skill属性与current_user. 一个简单的版本可能看起来像:

def create
  @user_skill = current_user.user_skills.create(params[:user_skill])
  respond_with @user_skill
end
于 2013-08-21T02:38:05.673 回答