User
与many-to-many
到Organization
的{{1}}关系。 Relationship
表包含User
,也可以是default_relationship_id
。
在具有用户个人资料的nil
视图中,有一个下拉框,用户可以从中选择一个关系作为默认值。所有这一切都有效。
现在考虑以下具体方案:用户没有edit
的值并访问他的default_relationship_id
页面。如果它然后提交有效数据,它就可以工作。但是,如果用户提交了无效数据,则会从控制器中触发edit
。这会产生错误render edit
,指的是下拉框。如果首先undefined method 'empty?' for nil:NilClass
其值不是default_relationship_id
,则不会出现此错误。
为什么nil
因render 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>
答案 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)”并显示方法。