HTMLとJSONの両方のクライアントリクエストに応答するRails3コントローラーがあります。このコントローラーには、params [:user]に投稿された値を使用して新しい「user」モデルオブジェクトを作成する「create」メソッドがあります。これは、ユーザーパラメータ値がHTMLフォームから投稿されたときに意図したとおりに機能します。ただし、JSONクライアント(私の場合はiOS)からこのアクションに投稿する場合、params [:user]はnilです。paramsハッシュに直接アクセスする場合、つまりparams [:username] => "someusername"の場合、正しい値が含まれていることに気付きました。
コントローラでparams[:model_name]構文を使用できるように、HTTPリクエストに追加する必要があるものはありますか?RailsアプリケーションにPOSTするためにASIFormDataRequest.mを使用しています。
私のクライアントPOSTは次のようになります。
-(void)createUser:(NSString *)first
lastName:(NSString *)last
userName:(NSString *)user
email:(NSString *)email
password:(NSString *)password{
NSString *stringFormat = [NSString stringWithFormat:@"%@users.json", serviceBaseURL];
NSURL *url = [NSURL URLWithString:stringFormat];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
User *requestedUser = [[User alloc]initWithId:nil firstName:first lastName:last userName:user email:email password:password];
request.tag = CREATE_USER;
request.userInfo = [NSDictionary dictionaryWithObject:requestedUser forKey:@"requestedUser"];
[request setPostValue:first forKey:@"first_name"];
[request setPostValue:last forKey:@"last_name"];
[request setPostValue:user forKey:@"username"];
[request setPostValue:email forKey:@"email"];
[request setPostValue:password forKey:@"password"];
request.Delegate = self;
[request startAsynchronous];
}
コントローラの「create」メソッドは次のようになります。
def create
@user = User.new(params[:user])
if @user.save #This will fail because params[:user] is nil when posted from iOS!
flash[:notice] = {:success => "User Created."}
session[:user_id] = @user.id
session[:username] = @user.username
respond_to do |format|
format.json {render :json => @user}
format.html{redirect_to(:controller => 'lists', :action => 'index')}
end
else
flash[:notice] = {:error => @user.errors}
respond_to do |format|
#format.json {render :json => @user.errors}
format.json {render :json => params[:username]} #This has a value. So the form parameters are sent.
format.html{render('new')}
end
end
end