控制器中的Rails和URL参数

时间:2015-12-07 19:02:13

标签: ruby-on-rails ruby-on-rails-4

我在一个非常简单的问题上花了好几个小时,我只是不知道自己做错了什么。

我正在尝试从浏览器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存在,由于某种原因,它似乎无法找到肯定存在的记录...

有人能帮我找到我所缺少的东西吗?

3 个答案:

答案 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)

我假设实施了强大的参数。确保:在您允许的参数中列出了招募人员。