From a4e7e604670a471c6a05690e61728bb0a4d1ffe8 Mon Sep 17 00:00:00 2001 From: Jeremy Ellison Date: Tue, 11 Jan 2011 13:57:28 -0500 Subject: [PATCH] Functionally complete new example. --- Code/CoreData/RKManagedObject.m | 2 +- Code/ObjectMapping/RKObject.m | 2 +- Code/ObjectMapping/RKObjectMappable.h | 4 +- .../Controllers/DBLoginViewController.m | 1 + .../Controllers/DBPostTableViewController.m | 54 +++++++++++------- .../Controllers/DBPostsTableViewController.m | 7 ++- .../Classes/DiscussionBoardAppDelegate.m | 7 ++- .../DiscussionBoard/Classes/Models/DBPost.h | 1 + .../DiscussionBoard/Classes/Models/DBPost.m | 11 ++-- .../DiscussionBoard/Classes/Models/DBTopic.h | 1 + .../DiscussionBoard/Classes/Models/DBTopic.m | 6 +- .../DataModel.xcdatamodel/elements | Bin 37301 -> 40333 bytes .../DataModel.xcdatamodel/layout | Bin 6988 -> 6983 bytes .../app/controllers/posts_controller.rb | 8 +-- .../app/controllers/topics_controller.rb | 8 +-- .../app/models/post.rb | 4 ++ .../app/models/topic.rb | 4 ++ 17 files changed, 79 insertions(+), 41 deletions(-) diff --git a/Code/CoreData/RKManagedObject.m b/Code/CoreData/RKManagedObject.m index 8893f69f..5ea51200 100644 --- a/Code/CoreData/RKManagedObject.m +++ b/Code/CoreData/RKManagedObject.m @@ -157,7 +157,7 @@ return [self valueForKey:[[self class] primaryKeyProperty]]; } -- (NSDictionary*)paramsForSerialization { +- (id)paramsForSerialization { NSMutableDictionary* params = [NSMutableDictionary dictionary]; for (NSString* elementName in [[self class] elementToPropertyMappings]) { NSString* propertyName = [[[self class] elementToPropertyMappings] objectForKey:elementName]; diff --git a/Code/ObjectMapping/RKObject.m b/Code/ObjectMapping/RKObject.m index cdfeb628..a13c8ab9 100644 --- a/Code/ObjectMapping/RKObject.m +++ b/Code/ObjectMapping/RKObject.m @@ -23,7 +23,7 @@ return [[self new] autorelease]; } -- (NSDictionary*)paramsForSerialization { +- (id)paramsForSerialization { NSMutableDictionary* params = [NSMutableDictionary dictionary]; for (NSString* elementName in [[self class] elementToPropertyMappings]) { NSString* propertyName = [[[self class] elementToPropertyMappings] objectForKey:elementName]; diff --git a/Code/ObjectMapping/RKObjectMappable.h b/Code/ObjectMapping/RKObjectMappable.h index e5e21857..dddf3b61 100644 --- a/Code/ObjectMapping/RKObjectMappable.h +++ b/Code/ObjectMapping/RKObjectMappable.h @@ -7,6 +7,8 @@ * */ +@protocol RKRequestSerializable; + /** * Must be implemented by all classes utilizing the RKModelMapper to map REST * responses to domain model classes @@ -43,7 +45,7 @@ * will encode these parameters into a serialization format (form encoded, JSON, etc). This is * required to use putObject: and postObject: for updating and creating remote object representations. */ -- (NSDictionary*)paramsForSerialization; +- (id)paramsForSerialization; /** * Must return a new autoreleased instance of the model class ready for mapping. Used to initialize the model diff --git a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Controllers/DBLoginViewController.m b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Controllers/DBLoginViewController.m index 4ce7f40b..ec8807b9 100644 --- a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Controllers/DBLoginViewController.m +++ b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Controllers/DBLoginViewController.m @@ -78,6 +78,7 @@ _passwordField.returnKeyType = UIReturnKeyGo; } self.dataSource = [TTListDataSource dataSourceWithItems:items]; + [_usernameField becomeFirstResponder]; } diff --git a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Controllers/DBPostTableViewController.m b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Controllers/DBPostTableViewController.m index dc6b0d4c..159b0a02 100644 --- a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Controllers/DBPostTableViewController.m +++ b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Controllers/DBPostTableViewController.m @@ -8,6 +8,7 @@ #import "DBPostTableViewController.h" #import +#import "DBUser.h" @implementation DBPostTableViewController @@ -51,9 +52,6 @@ } _requiresLoggedInUser = YES; - if (![self isNewRecord]) { - _requiredUserID = _post.userID; - } [super loadView]; @@ -61,40 +59,56 @@ _bodyTextEditor.font = [UIFont systemFontOfSize:12]; _bodyTextEditor.autoresizesToText = NO; _bodyTextEditor.delegate = self; + _bodyTextEditor.text = _post.body; } - (void)createModel { + BOOL isAuthorizedUser = [[DBUser currentUser].userID isEqualToNumber:_post.userID] || [self isNewRecord]; + NSMutableArray* items = [NSMutableArray array]; - _bodyTextEditor.text = _post.body; - - [items addObject:[TTTableControlItem itemWithCaption:@"" control:(UIControl*)_bodyTextEditor]]; - // Attachment item. - if (_newAttachment) { - // has new attachment. show it. allow update. - [items addObject:[TTTableImageItem itemWithText:@"Tap to Replace Image" imageURL:@"" defaultImage:_newAttachment URL:@"db://updateAttachment"]]; - } else if (![[_post attachmentPath] isWhitespaceAndNewlines]) { - // Has existing attachment. allow replace - NSString* url = [NSString stringWithFormat:@"%@%@", [RKObjectManager sharedManager].client.baseURL, _post.attachmentPath]; - [items addObject:[TTTableImageItem itemWithText:@"Tap to Replace Image" imageURL:url defaultImage:nil URL:@"db://updateAttachment"]]; + if (isAuthorizedUser) { + [items addObject:[TTTableControlItem itemWithCaption:@"" control:(UIControl*)_bodyTextEditor]]; + if (_newAttachment) { + // has new attachment. show it. allow update. + [items addObject:[TTTableImageItem itemWithText:@"Tap to Replace Image" imageURL:@"" defaultImage:_newAttachment URL:@"db://updateAttachment"]]; + } else if (![[_post attachmentPath] isWhitespaceAndNewlines]) { + // Has existing attachment. allow replace + NSString* url = [NSString stringWithFormat:@"%@%@", [RKObjectManager sharedManager].client.baseURL, _post.attachmentPath]; + [items addObject:[TTTableImageItem itemWithText:@"Tap to Replace Image" imageURL:url defaultImage:nil URL:@"db://updateAttachment"]]; + } else { + // has no attachment. allow new one. + [items addObject:[TTTableTextItem itemWithText:@"Tap to Add Image" URL:@"db://updateAttachment"]]; + } } else { - // has no attachment. allow new one. - [items addObject:[TTTableTextItem itemWithText:@"Tap to Add Image" URL:@"db://updateAttachment"]]; + [items addObject:[TTTableLongTextItem itemWithText:_post.body]]; + NSString* url = [NSString stringWithFormat:@"%@%@", [RKObjectManager sharedManager].client.baseURL, _post.attachmentPath]; + [items addObject:[TTTableImageItem itemWithText:@"" imageURL:url URL:nil]]; } if ([self isNewRecord]) { self.title = @"New Post"; [items addObject:[TTTableButton itemWithText:@"Create" delegate:self selector:@selector(createButtonWasPressed:)]]; } else { - self.title = @"Edit Post"; - [items addObject:[TTTableButton itemWithText:@"Update" delegate:self selector:@selector(updateButtonWasPressed:)]]; - [items addObject:[TTTableButton itemWithText:@"Delete" delegate:self selector:@selector(destroyButtonWasPressed:)]]; + if (isAuthorizedUser) { + self.title = @"Edit Post"; + [items addObject:[TTTableButton itemWithText:@"Update" delegate:self selector:@selector(updateButtonWasPressed:)]]; + [items addObject:[TTTableButton itemWithText:@"Delete" delegate:self selector:@selector(destroyButtonWasPressed:)]]; + } else { + self.title = @"Post"; + } } - self.dataSource = [TTListDataSource dataSourceWithItems:items]; + NSString* byLine = @""; + if (![self isNewRecord]) { + NSString* username = (isAuthorizedUser ? @"me" : _post.username); + byLine = [NSString stringWithFormat:@"posted by %@", username]; + } + self.dataSource = [TTSectionedDataSource dataSourceWithArrays:byLine, items, nil]; } - (void)updateAttachment { + [_bodyTextEditor resignFirstResponder]; UIImagePickerController* controller = [[[UIImagePickerController alloc] init] autorelease]; controller.delegate = self; [self presentModalViewController:controller animated:YES]; diff --git a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Controllers/DBPostsTableViewController.m b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Controllers/DBPostsTableViewController.m index 678d263e..538ea56f 100644 --- a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Controllers/DBPostsTableViewController.m +++ b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Controllers/DBPostsTableViewController.m @@ -71,7 +71,12 @@ for(DBPost* post in model.objects) { NSString* url = [NSString stringWithFormat:@"db://posts/%@", post.postID]; - [postItems addObject:[TTTableLongTextItem itemWithText:post.body URL:url]]; + NSString* imageURL = [NSString stringWithFormat:@"%@%@", [RKObjectManager sharedManager].client.baseURL, + post.attachmentPath]; + TTTableImageItem* item = [TTTableImageItem itemWithText:post.body + imageURL:imageURL + URL:url]; + [postItems addObject:item]; } self.dataSource = [TTSectionedDataSource dataSourceWithArrays:@"Topic", diff --git a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/DiscussionBoardAppDelegate.m b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/DiscussionBoardAppDelegate.m index 1704e191..6ddd245f 100644 --- a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/DiscussionBoardAppDelegate.m +++ b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/DiscussionBoardAppDelegate.m @@ -9,6 +9,7 @@ #import "DiscussionBoardAppDelegate.h" #import #import +#import #import #import #import "DBTopicsTableViewController.h" @@ -52,13 +53,16 @@ static NSString* const kAccessTokenHeaderField = @"HTTP_USER_ACCESS_TOKEN"; // Set Up Router RKDynamicRouter* router = [[[RKDynamicRouter alloc] init] autorelease]; +// RKRailsRouter* router = [[[RKRailsRouter alloc] init] autorelease]; [router routeClass:[DBUser class] toResourcePath:@"/signup" forMethod:RKRequestMethodPOST]; [router routeClass:[DBUser class] toResourcePath:@"/login" forMethod:RKRequestMethodPUT]; +// [router setModelName:@"topic" forClass:[DBTopic class]]; [router routeClass:[DBTopic class] toResourcePath:@"/topics" forMethod:RKRequestMethodPOST]; [router routeClass:[DBTopic class] toResourcePath:@"/topics/(topicID)" forMethod:RKRequestMethodPUT]; [router routeClass:[DBTopic class] toResourcePath:@"/topics/(topicID)" forMethod:RKRequestMethodDELETE]; +// [router setModelName:@"post" forClass:[DBPost class]]; [router routeClass:[DBPost class] toResourcePath:@"/topics/(topicID)/posts" forMethod:RKRequestMethodPOST]; [router routeClass:[DBPost class] toResourcePath:@"/topics/(topicID)/posts/(postID)" forMethod:RKRequestMethodPUT]; [router routeClass:[DBPost class] toResourcePath:@"/topics/(topicID)/posts/(postID)" forMethod:RKRequestMethodDELETE]; @@ -89,9 +93,6 @@ static NSString* const kAccessTokenHeaderField = @"HTTP_USER_ACCESS_TOKEN"; NSLog(@"User: %@", user); [objectManager.client setValue:[DBUser currentUser].singleAccessToken forHTTPHeaderField:@"USER_ACCESS_TOKEN"]; - // Testing - TTOpenURL(@"db://posts/9"); - return YES; } diff --git a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBPost.h b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBPost.h index 97853d3f..c96e606b 100644 --- a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBPost.h +++ b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBPost.h @@ -24,6 +24,7 @@ @property (nonatomic, retain) NSDate* updatedAt; @property (nonatomic, retain) NSNumber* userID; @property (nonatomic, retain) NSNumber* postID; +@property (nonatomic, retain) NSString* username; @property (nonatomic, retain) UIImage* newAttachment; diff --git a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBPost.m b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBPost.m index f0069102..dcd946d8 100644 --- a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBPost.m +++ b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBPost.m @@ -22,6 +22,7 @@ @dynamic updatedAt; @dynamic userID; @dynamic postID; +@dynamic username; @synthesize newAttachment = _newAttachment; @@ -38,6 +39,7 @@ @"attachment_path", @"attachmentPath", @"attachment_updated_at", @"attachmentUpdatedAt", @"body", @"body", + @"user_login", @"username", nil]; } @@ -45,17 +47,18 @@ return @"postID"; } -- (NSDictionary*)paramsForSerialization { +- (id)paramsForSerialization { RKParams* params = [RKParams params]; [params setValue:self.body forParam:@"post[body]"]; + NSLog(@"Self Body: %@", self.body); if (_newAttachment) { NSData* data = UIImagePNGRepresentation(_newAttachment); NSLog(@"Data Size: %d", [data length]); - [params setData:data MIMEType:@"application/octet-stream" forParam:@"topic[attachment]"]; + RKParamsAttachment* attachment = [params setData:data MIMEType:@"application/octet-stream" forParam:@"post[attachment]"]; + attachment.fileName = @"image.png"; } - // Suppress warning. todo: should this method return an by default? - return (NSDictionary*)params; + return params; } @end diff --git a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBTopic.h b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBTopic.h index eb74abb5..07c388be 100644 --- a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBTopic.h +++ b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBTopic.h @@ -18,5 +18,6 @@ @property (nonatomic, retain) NSNumber* userID; @property (nonatomic, retain) NSDate* createdAt; @property (nonatomic, retain) NSDate* updatedAt; +@property (nonatomic, retain) NSString* username; @end diff --git a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBTopic.m b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBTopic.m index bdac5472..c37fbdf7 100644 --- a/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBTopic.m +++ b/Examples/RKDiscussionBoardExample/DiscussionBoard/Classes/Models/DBTopic.m @@ -15,6 +15,7 @@ @dynamic userID; @dynamic createdAt; @dynamic updatedAt; +@dynamic username; #pragma mark RKObjectMappable methods @@ -24,7 +25,8 @@ @"name",@"name", @"user_id",@"userID", @"created_at",@"createdAt", - @"updated_at",@"updatedAt", + @"updated_at",@"updatedAt", + @"user_login", @"username", nil]; } @@ -32,7 +34,7 @@ return @"topicID"; } -- (NSDictionary*)paramsForSerialization { +- (id)paramsForSerialization { return [NSDictionary dictionaryWithObjectsAndKeys: self.name, @"topic[name]", nil]; } diff --git a/Examples/RKDiscussionBoardExample/DiscussionBoard/DataModel.xcdatamodel/elements b/Examples/RKDiscussionBoardExample/DiscussionBoard/DataModel.xcdatamodel/elements index 93250fa5b2190368d662ede368f4c431a483510b..3d3ff91c3db8cef85812a2cf7701c8735150c688 100644 GIT binary patch literal 40333 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 BnJxeT literal 37301 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 Oj0@d=jsLe@`TqddeWxe@ diff --git a/Examples/RKDiscussionBoardExample/DiscussionBoard/DataModel.xcdatamodel/layout b/Examples/RKDiscussionBoardExample/DiscussionBoard/DataModel.xcdatamodel/layout index b43c2ce3bf9c2c86bac61fed3e586f8585e51dc1..7686034f83648493db68870c0b996afdb6778e28 100644 GIT binary patch delta 2595 zcmZXWc~n%_9mnszZ{ECpe{YZ&QBf9^s&U^Cgi%B`VNe+M0Y(^E28IE}MCVbB$+6Z* zUNvbwsS(t864Rz?Yt2cc)Sz)oj8=`-)+*4vK zw}g!mbWtaj$L4q!0HAZn&4X!RHb@5$~gi1$`{eU2JeiF;0}BO@VB=S65F%l%`I zfjM9<$O73pgG(x1b#>LQDtC5|>8{Iqa>hSOak3P53@ z*w1(uX+|YZvKv7WaDigreC8aaoB*Z3ZIaD1iz)-T+m|ZelCl75t;C z0aw2A%fPF-Pwz6(-U5~b=k`ffHwx{lsvYc`o9dY1t@gK= zw(|t|+{8a%UhP3}2&5ZrqytX_$4x7k>P!6JJDGYhsM`xpfO9$@Hxl%u`WBownyEg_ zCU60CfQ#UgiPlWT5?zU|fU8C)rQ$8%n(6JNLSE?d-T>d3#m0N9YFs{lmAi}LrinL% zJ`cMK;@RM6=P@|KgxUc|ntjf2RhPNrz4g_8eR6kFI0}v~6s1&0O1<4_DrE<+D02&n>p&4I^ir+oiGU|>#=(LbLxbt zFwInFILv^K(D>KP_QjccjDDuaX}!7$=Nhx*FzSgqq0>}Q)VN;CfVnUacwhkt*X=)( zMRe~##a*)49>+&w&~H>ovC)OkQ=Nien^Y0-pYUuCRe?$6d`6YuJJ`ABsLmS;*=8?3()tE6kOO7ui(27+Fd9zPUAm@EZ$;V2iE{J> z`a-=?mM`9DlI3s1m&x*lvq!s|j|x#yp{P7P$iX}*&3fTzLj`wGoNWtl#&*RMnKT?{tg!(m`7m;_?rBp3@*U?$9i zWzYj_pbz?C16&LPun8`Ozk-|LAK_>447?0)!Jpt`1QCXCL?98#C>Zrc{ZN0DY`&GH z$cviLIu{0IGj{)>J@571AThJ|1QurMqF8-m4Qnb-v{tkd@H^k|1-W5--92-597D- zhgROISwpN5*3s4pR=YLDnr5AA&9>%P^Q=wQHP&~mJFIQilh#fGCnQ24G$M!yCPIh- zL?|(s2q&@$H&I6{A#~!G#4_Sf#4e(pI7Zwg9*{WMhm0a8lhI@xX(toOBr=dfrjhBS zgPcQVk>#Y9Y#;+<6SkK(Dm)F3L1 zilBy4G1N3Fo|;Z2Q0Y_wRYa9gmDDoo4eC8=7qyQ%LY<_pQ8#IfW@wcTr6cIEbPk6gBQxWfiOggs znu%fT%nW8GGmA-PUSrlUEzCw{GqZ&`&2%uAnCr|9=6mKAbBDRh++*%D51B{IW0qh= zwm%!rj$o&-Q`rPImn~)k4Qvy;g5AJwVRy3!*t_gw4ssZWa|B0mGN*Djt`GMDH-?Mm zVmLcDgPX~@xOrSTH=nEI>bV8nGHyAyiQC5Q;Qr0s=6>Mra}Rl(CwP^&@v(d&pTwu| zbNOsOz`xF~;G21aU&Ft}f5Lyt@8SQ>e-_{m@Q3&#{FnS!0w#!pEU1D_h!>^{vxHngQkP@a0Ric#P%1C9DQmWJ{bxOUmK-s8lRz6TZRJJKQl)or{RX$ce zQ9f1nDc6-7%1xzHxvkt&?kf+KM=DS!sMFO1HBn7c7pjZYfZC)kQMC`$ z`nLKvb+_84?o|Wr>Ou9e`h|K_J*IJ5UoBD_szqtTwL;CM&C|-Y3av`>YPDLOR#qixYX)b?mcv@f-j+Sl3{?W}e|yQp2(u4>@Hx{{V#n#vlLy delta 2638 zcmZvec~lkG8Nk1LXXeem&pdI9NJStJf*LjMY@)b4)F(bbSsw5NL_zSO;8F%r+orCW z_NeLcBto^usxj4=T61EIbvJ5UQjNA&qaNJqu^MYNY6pmw9GyRA?!Dh#e&4;nbI%;; zbF|NLHxa;-SG13eng=v6V1gUkL5NchgGlE+5C%aajDm5H0ohOtrBJqF%0$YGCZOyU zhkH>M&_#63#wc1Ig*|v2o`kb;4$j2|c7GJxac(0>AcJCIi?GN>(42~4QBGx+U61CV zncJQr4Mq2in>X(yu)xD$7-AU>5Dy8KU@2!H36h=mp^yT@U^t}02>UeIBQY~0d03@? zdT~jCC58>L04!O5<~*mtDKe*=5u?EaX)p%HPV#t@%BPlBdZ+sf0_h&_xM7Kwq#!$z zilMzQ9@1fgeV2Ic^>pxMc)V%(QvwCSlh7Q=gskk0WN)ytyfokq)=UjF!bF$^K6^UV zx&1eg1G&yRDUb(#$cF+bgm9P)MRp?5&7Mw#chM}}Vp^y^Xr@xzQcbZW`w-DZY}+=? zjwEASkji1YolS<(6;KH?ob|HFPR43S5P24)8KIz9r8lxNg_E45|TcIIVRqQeIJD(KIj8b~cG3{-mq!AA5J z>J7eEg|a-}=e=5|=!@RYRSY|iG`L385A|;z)>5^13l*LoFFZvf98b|mG|Gy%65Du+ zJSYuP(OBqiCA_5Opf(4N((Ue4%;2AhgnTH&5ve}F{xb>O^R#ywg_@3+WT!J6Z9jD#ofYX_o4 zl;&KOIj97cqDmA*Gf_3FMRlkiEksMu2J|u7k1n9==stRe5hgH&Y0P2`8@MCxjJx2j z&aIk_C*ulSkJsRx_#i%yui$IA3E#lC@W1eX@PF}R`~*KE+7Y2d7!g545z$0E;UTh! z@>-&Xm_t~^eB#%{65>7L55#8TBjRJ?JaL7%Lp&sbq)3TuM~0IzWPdW1%qN57B62mk zj@(FYBDauR$(`gb@*sJbyiPtKA5vjdG&PbMPX#H9T1Ks+KA_f7Tc}T{PpO^Mm()?} z81+5%)TOxExk6o0uHLTN{;m{Pnro~p!j1ckOWPb)9wHqiI^FO}ZW3 zp6*D8(qVKrx;q_7XVFD;6>ZV;=>_y6dKKH|{u~JSV0rI3Xwt&VXzP{qzc(Wp-?T<3yXzDVWY4|I3he0kw}P?NQ6A>#nrz5!IYb^R z50gj99@#6`rprD#Q=TYi%eiuqyjWf;FPGnyeIQYA zx=G!m?o|(}ht*T+8TGPyMU%7$Ek=vg;m`!^e%c={bzc(9-+tRv3i`|Q-4dZovhE$tMplVjlN#rpl{Yc(zok7 z^gru=(Ld8a*T2vY>bLbf`d$5={=NQ4|3QChfPszv#xNt*7-@_)W*c*jI-}lLWc<>2 z$5?DEHI^Ii8t)mqjXlO*W1n%rIBFa-P8cVR)23{8HeWYm%vdwd^qU1{u{mX`In69L zE6f>Yl{w3-G3S_b%?0KXbD6oy{G++m+-sgNPnze<^XA{pi{>@6$-H6SGVhuX%*Srh i-ND_}9qaDv9_aSCz3vR>FUEN={_$JV`hEU(XZ;U{ddy1z diff --git a/Examples/RKDiscussionBoardExample/discussion_board_backend/app/controllers/posts_controller.rb b/Examples/RKDiscussionBoardExample/discussion_board_backend/app/controllers/posts_controller.rb index 82b33e55..0f97dc42 100644 --- a/Examples/RKDiscussionBoardExample/discussion_board_backend/app/controllers/posts_controller.rb +++ b/Examples/RKDiscussionBoardExample/discussion_board_backend/app/controllers/posts_controller.rb @@ -7,19 +7,19 @@ class PostsController < ApplicationController before_filter :requre_owner, :only => [:update, :destroy] index.response do |wants| - wants.json{ render :json => collection.to_json(:methods => :attachment_path) } + wants.json{ render :json => collection.to_json(:methods => [:attachment_path, :user_login]) } end create.response do |wants| - wants.json{ render :json => object.to_json(:methods => :attachment_path) } + wants.json{ render :json => object.to_json(:methods => [:attachment_path, :user_login]) } end update.response do |wants| - wants.json{ render :json => object.to_json(:methods => :attachment_path) } + wants.json{ render :json => object.to_json(:methods => [:attachment_path, :user_login]) } end destroy.response do |wants| wants.json{ render :json => {} } end show.response do |wants| - wants.json{ render :json => object.to_json(:methods => :attachment_path) } + wants.json{ render :json => object.to_json(:methods => [:attachment_path, :user_login]) } end create.before do diff --git a/Examples/RKDiscussionBoardExample/discussion_board_backend/app/controllers/topics_controller.rb b/Examples/RKDiscussionBoardExample/discussion_board_backend/app/controllers/topics_controller.rb index c1a1dabe..6813f177 100644 --- a/Examples/RKDiscussionBoardExample/discussion_board_backend/app/controllers/topics_controller.rb +++ b/Examples/RKDiscussionBoardExample/discussion_board_backend/app/controllers/topics_controller.rb @@ -5,19 +5,19 @@ class TopicsController < ApplicationController before_filter :requre_owner, :only => [:update, :destroy] index.response do |wants| - wants.json { render :json => collection } + wants.json { render :json => collection.to_json(:methods => :user_login) } end create.response do |wants| - wants.json{ render :json => object } + wants.json{ render :json => object.to_json(:methods => :user_login) } end update.response do |wants| - wants.json{ render :json => object } + wants.json{ render :json => object.to_json(:methods => :user_login) } end destroy.response do |wants| wants.json{ render :json => {} } end show.response do |wants| - wants.json{ render :json => object } + wants.json{ render :json => object.to_json(:methods => :user_login) } end create.before do diff --git a/Examples/RKDiscussionBoardExample/discussion_board_backend/app/models/post.rb b/Examples/RKDiscussionBoardExample/discussion_board_backend/app/models/post.rb index 0d064ce8..23976f82 100644 --- a/Examples/RKDiscussionBoardExample/discussion_board_backend/app/models/post.rb +++ b/Examples/RKDiscussionBoardExample/discussion_board_backend/app/models/post.rb @@ -7,4 +7,8 @@ class Post < ActiveRecord::Base attachment.url end + def user_login + user.login + end + end diff --git a/Examples/RKDiscussionBoardExample/discussion_board_backend/app/models/topic.rb b/Examples/RKDiscussionBoardExample/discussion_board_backend/app/models/topic.rb index 96264c4f..f06cfd6b 100644 --- a/Examples/RKDiscussionBoardExample/discussion_board_backend/app/models/topic.rb +++ b/Examples/RKDiscussionBoardExample/discussion_board_backend/app/models/topic.rb @@ -4,4 +4,8 @@ class Topic < ActiveRecord::Base validates_presence_of :name validates_presence_of :user + + def user_login + user.login + end end