Android Volley Rails: NoMethodError (undefined method `+@' for "":String)

Android Volley Rails: NoMethodError (undefined method `+@' for "":String)

我的 android 应用程序中有 Volley 方法,用于在 rails MySQL 数据库中访问和创建事件条目:

                   JsonObjectRequest createEventGetID = new JsonObjectRequest(Request.Method.POST, "http://" + Global.getFeastOnline() + "/createEvent",
                            new JSONObject(jsonParams),
                            new Response.Listener<JSONObject>() {

                                protected Map<String, String> getParams() {
                                    Map<String, String> params = new HashMap<String, String>();
                                    params.put("user_id", settings.getString("userID","0"));
                                    params.put("campaign_id", "-1");
                                    params.put("location_id", "-1");
                                    params.put("event_active", event.getAlarmActive().toString());
                                    params.put("event_removed", "0");
                                    params.put("event_time", event.getAlarmTimeString());
                                    params.put("event_days", Base64.encodeToString(buff, Base64.DEFAULT)); 
                                    params.put("event_tone", event.getAlarmTonePath());
                                    params.put("event_vibrate", event.getVibrate().toString());
                                    params.put("event_name", event.getAlarmName());
                                    params.put("event_date", event.getAlarmDateString());

                                    return params;
                                }

                                @Override
                                public void onResponse(JSONObject response) {
                                    // Parse the JSON:
                                    try {
                                        // Returning JSON, tag:
                                        JSONArray newEventID = response.getJSONArray("new_event_server_id");

                                        Toast.makeText(getApplicationContext(), newEventID.toString(), Toast.LENGTH_LONG).show();
                                        // PARSE THE REST

                                        //Log.v("New Event ID", "The new event id is " + userId);

                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }
                                }
                            },
                            new Response.ErrorListener() {
                                @Override
                                public void onErrorResponse(VolleyError error) {
                                    // error
                                    Log.d("Create Events Error", error.toString());
                                }
                            }
                    );
                    requestQueue.add(createEventGetID);

Volley 发送没有问题,因为它们都是 POST 请求中的字符串。 rails中的createEvent方法是:

def createEvent 

        createEvent = "INSERT INTO events(
                                      event_creator_id
                                    , campaign_id
                                    , location_id
                                    , event_active
                                    , event_removed
                                    , event_time
                                    , event_days
                                    , event_tone
                                    , event_vibrate
                                    , event_name
                                    , event_date
                                    , created_at
                                    , updated_at                                    
                       ) VALUES (" 
                               + params[:user_id].to_s + "," 
                               + params[:campaign_id].to_s + "," 
                               + params[:location_id].to_s + "," 
                               + params[:event_active].to_s + "," 
                               + params[:event_removed].to_s + "," 
                               + params[:event_time].to_s + "," 
                               + params[:event_days].to_s + "," 
                               + params[:event_tone].to_s + "," 
                               + params[:event_vibrate].to_s + "," 
                               + params[:event_name].to_s + "," 
                               + params[:event_date].to_s + "," 
                                + "NOW(),NOW()"
                               + ")"


        ActiveRecord::Base.connection.execute(createEvent)

    end

路由为:

  match '/createEvent', to: "requests#createEvent", via: 'post'

测试排球动作时,rails 命令行抛出错误为:

NoMethodError (undefined method `+@' for "":String):
  app/controllers/requests_controller.rb:522:in `createEvent'

在线:createEvent 方法的 + params[:user_id].to_s + ","

我已经尝试了所有方法,包括从 createEvent 方法中删除所有插入的值(除了硬编码的“0”),但错误仍然存​​在。

如何缓解这种情况?

哇,这不是一个好的控制器设计,并不是说您的代码不安全(等待 SQL 注入发生)。

只需使用 ActiveRecord,创建事件模型(将其放入 app/models/event.rb):

class Event < ActiveRecord::Base
end

然后编辑您的控制器:

def createEvent 
  Event.create!(event_creator_id: params[:user_id], campaign_id: params[:campaign_id], ...) # add all your parameters
  head :no_content
end

关于您最初的问题:您必须将“+”符号与前一个字符串放在同一行,因此您将得到类似的内容:

"...) VALUES (" + params[:user_id].to_s + "," + # plus is at the end of line, not the beginning
params[:campaign_id].to_s + "," +
# ... etc.