Rails中不用form_for打印模型数据的正确方法?@adjuster为空报错
解决@adjuster为空的问题&常规表单实现方式
首先,咱们先搞清楚为啥会出现@adjuster is empty的报错,再一步步改成你想要的常规表单写法。
先排查控制器&路由问题
你的show方法代码看起来没问题:
def show @adjuster = Adjuster.find(params[:id]) end
但报错说明@adjuster根本没被赋值,大概率是这几个原因:
- 路由没匹配到show动作:确认你用了
resources :adjusters生成标准路由,访问的URL是不是类似/adjusters/1(1是实际的记录ID)?如果访问的是/adjusters/new或者其他路径,那走的不是show方法,自然没有@adjuster。 - params[:id]无效:在show方法里加个调试代码,比如
puts params[:id],然后重启服务器刷新页面,看控制台有没有输出正确的ID。如果ID是空的,那Adjuster.find会直接抛出RecordNotFound异常,你应该能看到这个错误;如果没看到,说明请求根本没到show方法。 - 视图渲染的动作不对:你是不是把这段表单代码放在了new/edit视图里?那些视图对应的控制器动作里没赋值
@adjuster(或者new里是@adjuster = Adjuster.new),自然会报错。
改用常规表单的正确写法
如果你只是想显示模型数据,完全不需要用form_for,直接输出就行:
<div class="row"> <div class="large-4 columns"> <b>Adjuster Name</b><br> <%= @adjuster.adjuster_name %> </div> </div>
如果是想做可提交的常规HTML表单(比如编辑数据),那得自己写form标签,指定动作和方法:
<!-- 编辑表单,用patch方法提交到adjuster的更新路由 --> <form action="<%= adjuster_path(@adjuster) %>" method="post"> <!-- Rails需要这个隐藏字段来识别patch请求 --> <%= hidden_field_tag :_method, 'patch' %> <!-- Rails CSRF令牌,必须加,否则提交会报错 --> <%= csrf_meta_tags %> <div class="row"> <div class="large-4 columns"> <label>Adjuster Name</label> <input type="text" name="adjuster[adjuster_name]" value="<%= @adjuster.adjuster_name %>"> </div> </div> <button type="submit" class="button">保存修改</button> </form>
这里要注意两个关键细节:
- Rails里更新资源要用
patch方法,但HTML表单只支持GET/POST,所以要加hidden_field_tag :_method, 'patch'来模拟HTTP patch请求。 - 必须加
csrf_meta_tags(或者单独的csrf_token_tag),否则Rails会拒绝请求,报CSRF验证错误。
额外提醒
如果你之前用form_for能正常显示,说明当时的@adjuster是有值的,大概率是现在的视图渲染路径不对,先确认你是在show视图里渲染这段代码,并且访问的是正确的show路径哦。
内容的提问来源于stack exchange,提问作者chase dougherty
相关产品推荐
相关产品推荐

