视图中布尔判断逻辑失效:@job_running为true时提交按钮仍显示
解决表单提交按钮在
@job_running为true时仍显示的问题 看起来你遇到的核心问题是条件渲染逻辑没有生效,不管怎么设置@job_running为true,提交按钮始终可见。咱们一步步排查定位:
1. 先确认视图中提交按钮的条件判断是否正确
你贴出的表单代码里没有包含提交按钮的部分,这大概率是问题的关键!要实现“当@job_running为true时隐藏按钮”,必须给按钮加上明确的条件判断逻辑。
推荐两种正确的写法:
方式一:用unless直接修饰提交按钮
<%= form_for @when, url: {controller: "page_scraper", action: "set_schedule"} do |f| %> <span>Every:</span> <%= select_tag 'hour', ... %> <!-- 给按钮添加条件:只有@job_running为false时才显示 --> <%= f.submit "Set Schedule", unless: @job_running %> <% end %>
方式二:用unless代码块包裹按钮
<%= form_for @when, url: {controller: "page_scraper", action: "set_schedule"} do |f| %> <span>Every:</span> <%= select_tag 'hour', ... %> <% unless @job_running %> <%= f.submit "Set Schedule" %> <% end %> <% end %>
注意:逻辑是“@job_running为true时隐藏”,所以用unless @job_running(等同于if !@job_running)是正确的——只有变量为false时才会渲染按钮。
2. 验证@job_running是否真的传递到了视图
有时候变量赋值的时机或位置不对,导致视图拿到的并不是你期望的true。可以在视图里加一行调试代码,确认变量的实际值:
<!-- 在表单上方添加,测试完成后记得删除 --> <%= "当前job_running的值:#{@job_running.inspect}" %>
如果显示的是nil或者false,说明控制器的赋值逻辑有问题:
- 确保渲染这个表单的对应控制器action(比如
page_scraper#index或你用来展示表单的action)里,在render操作之前就设置了@job_running = true - 不要在
after_action或者视图渲染完成后才赋值,那样变量不会同步到视图中
3. 排查其他可能的干扰因素
- 缓存问题:如果开发环境开启了页面缓存,可能变量更新了但视图还是旧的。可以执行
rails tmp:clear清除缓存,或者在config/environments/development.rb里设置config.action_controller.perform_caching = false关闭缓存 - 前端JS干扰:检查页面有没有JavaScript代码会在加载后强制显示按钮,比如
document.querySelector('input[type="submit"]').style.display = 'block'这类逻辑
按照上面的步骤排查,应该能解决问题。如果还是不行,可以把控制器里赋值@job_running的代码和完整的视图代码贴出来,方便进一步定位。
内容的提问来源于stack exchange,提问作者Padu
相关产品推荐
相关产品推荐

