零值:访问编辑视图时没有问题,但在触发时导致错误'渲染编辑'

时间:2015-08-14 11:49:02

标签: ruby-on-rails ruby ruby-on-rails-4

Usermany-to-manyOrganization的{​​{1}}关系。 Relationship表包含User,也可以是default_relationship_id

在具有用户个人资料的nil视图中,有一个下拉框,用户可以从中选择一个关系作为默认值。所有这一切都有效。

现在考虑以下具体方案:用户没有edit的值并访问他的default_relationship_id页面。如果它然后提交有效数据,它就可以工作。但是,如果用户提交了无效数据,则会从控制器中触发edit。这会产生错误render edit,指的是下拉框。如果首先undefined method 'empty?' for nil:NilClass其值不是default_relationship_id,则不会出现此错误。

为什么nilrender edit值而失败,而可以访问编辑视图?以及如何处理这个?

迁移:

nil

t.integer :default_relationship_id 的模型验证适用于不是default_relationship_id的情况。

视图中的代码:

nil

控制器方法:

<label class="col-md-4 control-label" for="default_relationship_id">Default</label> 
<div class="col-md-8">
  <%= f.collection_select :default_relationship_id, @relationships, :id, :name, {}, {class: 'form-control input-md'} %>
</div>

1 个答案:

答案 0 :(得分:3)

你必须在else分支中初始化@relationships变量:

 def update
  @user = User.find(params[:id])
  if @user.update_attributes(strong_params)
    flash[:success] = "Updated"
    redirect_to @user
  else
    @relationships = @user.relationships.where(member: true)
    render 'edit'
  end
end

或者为了避免重复,您可以保留操作并改为调整视图:

 <div class="col-md-8">
   <%= f.collection_select :default_relationship_id, @user.relationships.where(member: true), :id, :name, {}, {class: 'form-control input-md'} %>
 </div>

在这种情况下,您还可以从编辑中删除“@relationships = @ user.relationships.where('member =?',true)”并显示方法。