在字符串4

时间:2015-09-03 07:30:21

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

我在控制器中有一个方法,用于检查数据库中是否已存在字段值。在我的情况下,我要检查多个字段,例如用户名,电子邮件和URL通过AJAX。

所以我写了下面的函数

  def check_field_already_exist?(field, params )

    merchant_url = MerchantUrl.where(field: filter_params[field.to_sym]).first

     # here params[:id] is available only while editing the MerchantUrl
     is_available = if (params[:id] && merchant_url)
                 merchant_url.id == params[:id]
               else
                 merchant_url.blank?
               end
  end

并以

方式调用此方法
  def is_name_available
    render json: check_field_already_exist?('username', params)
  end

  def is_url_available
    render json: check_field_already_exist?('url', params)
  end

  def is_email_available
    render json: check_field_already_exist?('email', params)
  end

但在执行时它会抛出错误

Mysql2 ::错误:未知栏' merchant_urls.field' 在' where子句':SELECT merchant_urls。* FROM {{1在merchant_urlsmerchant_urls =' http://localhost:3000'

那么,是否有任何方法可以将字符串变量用作字段名称? 谢谢。

4 个答案:

答案 0 :(得分:4)

正确的方式是使用旧的hashrocket语法

merchant_url = MerchantUrl.where(field => filter_params[field])

答案 1 :(得分:3)

在我看来,你这样做是错误的。当您将id传递给方法时(在params内),为什么不使用它来获取merchant_url,然后检查该字段是否包含内容:

def check_field_already_exist?(field, id=nil)
  if id && merchant_url = MerchantUrl.find(id)
    merchant_url.send(field).try('present?')
  else
    MerchantUrl.exists?(field => filter_params[field.to_sym])
  end 
end

然后你可以

def is_name_available
  render json: check_field_already_exist?('username', params[:id])
end

虽然我个人认为,我有一个方法将模型实例属性hash返回为json,然后用JavaScript客户端检查哈希的内容。这样,只需一次回调服务器即可获得所需数据(而不是每个字段一次)。

答案 2 :(得分:1)

在代码中,field是一个标识列名的符号。 你应该这样做:

merchant_url = MerchantUrl.where("#{field} = ?", filter_params[field.to_sym])

答案 3 :(得分:0)

我希望这有效

def check_field_already_exist?(field, params )

    merchant_url = MerchantUrl.where("#{field}=?", filter_params[field.to_sym]).first

    is_available = if (params[:id] && merchant_url)
                     merchant_url.id == params[:id]
                   else
                     merchant_url.nil?
                   end
  end

但请确保field不应该是最终用户可以通过params设置的东西。否则它将非常脆弱。