Le 2011-03-29 à 15:31, Andrew Kinnie a écrit :

> Well, first I tried to simply create the intervening object manually, but 
> then I realized I wanted to know if such an object already existed, so I was 
> going to do a fetch, but as random client wouldn't know the primary key of 
> the NoteType, I am not sure how to do that.  I could expose the primary key, 
> but I'd much rather not.
> 
> Presumably, the client could simple call the curl commands to create the 
> intervening object, then add the current object with a second line, but I 
> wanted to be able to do this in the java itself so the client could do 
> something like:
> 
> curl -X PUT -d "{noteType:{type:'NoteType', name:'Alert'}}" 
> http://My-MacBook-Pro.local:9001/cgi-bin/WebObjects/MyApp.woa/ra/Device/1/addNoteType.json
> 
> Then I would get the device, get the NoteType represented by the 
> routeObjectForKey("noteType") and set add the noteType to the relationship.
> 
>       public WOActionResults addNoteTypeAction() {
>               Device device = Device();
>               NoteType type = routeObjectForKey("noteType");
>               // set the relationships and do whatever else
>       ...

If you want to create a new NoteType to a Device, you should call the create() 
method in addNoteTypeAction instead of routeObjectForKey, and set the relation 
between the NoteType and the Device:

public WOActionResults addNodeTypeAction() {
   NoteType nodeType = create(NoteType.ENTITY_NAME, yourerxkeyfilter);
   Device device = routeObjectForKey("device");
   // set the relationship and call ec.saveObjects();
  return response(nodeType, yourerxkeyfilter);
}

And your route:

 requestHandler.addRoute(new ERXRoute(Device.ENTITY_NAME, 
"/Device/{device:Device}/addNoteType", ERXRoute.Method.Put, 
DevicesController.class, "addNoteType"));

This is untested, of course.

> 
> However, the routeObjectForKey gets a null value, presumably because there is 
> no key "noteType" in the Device class.  I gather there may be some way to do 
> this with variable substitution, but again, if I don't know the pk of the 
> NoteType, I'm confused about how I should be doing this.
> 
> Andrew
> 
> On Mar 29, 2011, at 2:59 PM, Pascal Robert wrote:
> 
>> 
>> Le 2011-03-29 à 14:52, Andrew Kinnie a écrit :
>> 
>>> Hi again.
>>> 
>>> I have been able to get my ERRest app to create new objects, and with a 
>>> to-one relationship based on the example app.  I note that apparently 
>>> ERRest (maybe rest in general) does not allow you to add an object to a 
>>> to-many relationship directly.  Apparently you need to first GET the 
>>> intervening object, or create one if it doesn't exist, then add the object 
>>> to it from the other side.  e.g. with Organization ->> Member, you'd have 
>>> to get or create the organization, then add the member to it.
>> 
>> I had this "problem" too, but Mike said it should work, and from memory it 
>> worked for a test case I did, but it didn't work in a specific project and 
>> the problem seemed to be because of non-model attributes that I had in this 
>> entity. Sadly, I didn't find the source of the problem before I left my job.
>> 
>>> What I want to do is create an Action method that allows me to look for an 
>>> existing intervening object based on an attribute, and if one doesn't 
>>> exist, then create one.  Then set that intervening object's relationships 
>>> back to original object and the pointed to object.
>>> 
>>> So:
>>> 
>>> I have an entity:  Device which has a to-many to another entity NoteType 
>>> (which in turn has a to-many back to Device)
>>> There is an intervening entity DeviceNoteType which has a to-one to Device 
>>> and another to NoteType
>>> 
>>> So in my DeviceController, I want to have an Action method updateNoteTypes 
>>> and perhaps another addToNoteTypes
>>> 
>>> I see in the wiki that this needs to be done in the two steps mentioned 
>>> above, but I don't want to require the calling app to do that, but rather 
>>> do it myself (e.g. passing in json with a name:"myNoteType") and be able to 
>>> have my method do the necessary fetching and setting.  
>>> 
>>> Whenever I try to do this, I get null as the value from routeObjectForKey.  
>>> Actually, I was getting that anyway, until I called the entity method in 
>>> the controller (e.g. the device() method in the DeviceController class, 
>>> then I can access the keys from that device.  But that doesn't help here.  
>>> I looked at the example app and do see any to-manys in there, and I've gone 
>>> through the screencast from WO-NoVA multiple times.  I'm just not seeing it.
>> 
>> Can you post the methods you are using?
> 

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to