求助:Rails方法本应返回布尔值却持续返回nil
问题分析与解决方案
嘿,我一眼就揪出问题所在了——你在视图里调用的是实例变量@method_name,但你定义的却是一个名为method_name?的实例方法,这俩完全不是一回事!因为你从来没给@method_name赋值过,它默认就是nil,这才导致你的条件判断一直走else分支。
核心问题拆解
你的方法逻辑本身是没问题的:
def method_name? DateTime.now < DateTime.new(2018, 5, 14, 23, 59, 59) end
这个方法确实会返回true或false(取决于当前时间是否早于2018年5月14日23:59:59),但你在视图里用错了调用方式。
针对不同场景的修正方案
场景1:方法定义在模型(Model)中
如果这是某个模型的实例方法,你需要用模型的实例来调用它。比如你在控制器里定义了@post = Post.find(params[:id]),那视图里应该这么写:
<% if @post.method_name? %> 显示此内容 <% else %> 显示彼内容 <% end %>
场景2:方法是控制器的辅助方法(想在视图直接调用)
如果这个方法是和业务逻辑无关的视图辅助方法,你可以在控制器里把它声明为helper方法:
class YourController < ApplicationController helper_method :method_name? def method_name? DateTime.now < DateTime.new(2018, 5, 14, 23, 59, 59) end end
然后在视图里直接调用方法本身,不用加实例变量:
<% if method_name? %> 显示此内容 <% else %> 显示彼内容 <% end %>
场景3:直接在视图helper文件定义
如果你只是临时测试,也可以把方法直接写在视图对应的helper文件里(比如app/helpers/your_helper.rb):
module YourHelper def method_name? DateTime.now < DateTime.new(2018, 5, 14, 23, 59, 59) end end
之后在视图里直接调用method_name?就可以了。
额外小提示
Rails里约定俗成,返回布尔值的方法名要以?结尾,你已经做到了,这点很棒!只要修正调用方式,你的方法就能正常返回true/false啦。
内容的提问来源于stack exchange,提问作者Jim B
相关产品推荐
相关产品推荐

