如何修改我的表单部分以处理has_one关联?

时间:2012-10-12 09:58:11

标签: ruby-on-rails ruby-on-rails-3 has-one

这是我_form.html.erb

的相关部分
<%= form_for(@score) do |f| %>
  <% if @score.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@score.errors.count, "error") %> prohibited this score from being saved:</h2>
      <ul>
      <% @score.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

    <div class="field">
      <%= f.label :client_id %><br />
      <%= f.select :client_id, @clients.collect { |c| [c.name, c.id] }, {:include_blank => 'None'} %>
    </div>  

  <div class="field">
    <%= f.label :firm_size %><br />
    <%= f.text_field :firm_size %>
  </div>
    .
    .
    .
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

当我有一个用于创建Score的通用名称并且有一组客户端通过clients通过控制器传入时,此部分工作。

问题在于只有一个client记录....比如说: myapp.com/client/6/scores/new/

鉴于我在params中有一个client_id,它给我一个零错误:

undefined method `collect' for nil:NilClass

如何针对单个@client记录解决此问题?

1 个答案:

答案 0 :(得分:1)

看起来您正在使用嵌套资源,因此对于myapp.com/client/6/scores/new/,您的new中的ScoreController方法应该被调用。

在这个方法中(或者在过滤器之前),我假设你有一行类似的东西:

@client = Client.find(params[:client_id])

现在,如果你想以你的方式使用你的部分,你要么必须确保有一个对象响应方法collect(即一个数组),其名称为{{1或者你可以继续重写你的部分并在@clients部分中将其拆分......

您获得的错误消息基本上意味着,当呈现if方法时,没有名为ScoreController#new的对象,因此它为零,而@clients没有方法NilClass < / p>

所以我会在你的collect方法中执行以下操作:

ScoreController#new

现在,我不确定这是一个优雅的解决方案,但它应该让你继续......