2013-08-21 29 views
0
Rails的局部变量为了

所以我有以下的雇员再培训局的作品:在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 method名”的零:NilClass`。所以我猜测表单构建器是以某种方式覆盖ul块内的user_skill。但为什么以及如何解决问题?它似乎不是一个formtastic问题,因为我也使用了本地表单构建器。

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

回答

0

致电current_user.user_skills.new将空白user_skill添加到has_many关联current_user。由于@user_skills只是对current_user.user_skills的引用,因此在初始化新user_skill记录后迭代时,空白实例将包含在无序列表中。

你会更好,只是初始化在形成新的user_skill

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

然后,在创建UserSkillsController的动作,与current_useruser_skill属性相关联。一个裸骨的版本可能看起来像这样:

def create 
    @user_skill = current_user.user_skills.create(params[:user_skill]) 
    respond_with @user_skill 
end 
+0

谢谢。这也是我发现的。我认为current_user.user_skills将只包含持久对象,这显然是不正确的。 – randomor