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.
我的 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.