我在一个非常简单的问题上花了好几个小时,我只是不知道自己做错了什么。
我正在尝试从浏览器URL(... /?ref = xokKfdhVpEtG3J83MF2oXmd2)中检索一个值,然后我想使用此值通过令牌搜索我的Foo模型,如下所示:
Foo.find_by(token: params[:ref])
我的完整代码如下:
def extract_foo_id
if params[:ref].present?
@foo = Foo.find_by(token: params[:ref]).id || nil
end
end
以下是我试图实现此目的的方法:
def create
@bar = Bar.new(bar_params)
@bar.recruited_by = extract_foo_id
respond_to do |format|
if @bar.save
format.js { render :replace_form }
else
format.js
end
end
end
我已经通过运行psql查询以及通过控制台中的ActiveRecord进行测试,确保上述示例中使用的令牌存在120%。但是,当我提交此操作时,'recruited_by'的结果始终为null。 我也试过在'create'动作中将'extract_foo_id'替换为'newsletter.find_by(token:params [:ref])。id'。这会出现一个错误,指出我在NULL对象上调用'id'方法。我可以看到,当我提交表单并且甚至尝试将值作为隐藏字段传递时,param存在,由于某种原因,它似乎无法找到肯定存在的记录...
有人能帮我找到我所缺少的东西吗?
答案 0 :(得分:1)
你做得很好。 extract_foo_id
上的小改进:
def extract_foo_id
raise 'no ref in params' unless params[:ref].present?
Foo.find_by(token: params[:ref]).id
end
这样你就可以确定params在那里。
答案 1 :(得分:0)
你必须返回值:
def extract_foo_id
if params[:ref].present?
return Foo.find_by(token: params[:ref]).try(:id)
end
end
答案 2 :(得分:0)
我假设实施了强大的参数。确保:在您允许的参数中列出了招募人员。